1 基于 Android 2.3 - Android 8.1的方案
Android2.3 增加了对音频混响的支持,通过 AudioEffect 可以方便地对 AudioTrack 和 MediaPlayer 播放的音乐进行音效控制。AudioEffect 是 Android 音频框架提供的用于控制音频效果的基类,开发者不应直接使用此类,应该使用它的派生类:
- Equalizer 均衡器:增加或降低某一频率的声音响度来达到想要的效果。
- Virtualizer 环绕音:让声音可以产生一种空间感,数值越大声音就距离耳机越远。
- BassBoost 重低音控制器:增加低音的强度。
- PresetReverb 预设混响(推荐用于音乐):使音乐通过声音在不同路径传播下造成的反射叠加产生的声音特效,比如流行,古典,爵士等。
- EnvironmentalReverb 环境混响(推荐用于游戏):比如马路,走廊,室内,大厅等。
以上音效包含在 android.media.audiofx 包中,可以参考官方文档。
为了使用音效处理需要在AndroidManifest.xml 添加相应的权限:
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
1.1 Equalizer
Equalizer 的使用方法如下:
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.test_cbr/*音频路径*/);
Equalizer equalizer = new Equalizer(0, mediaPlayer.getAudioSessionId());
equalizer.setEnabled(true);
//获取均衡器引擎支持的频段数
short bands = equalizer.getNumberOfBands();
//获取最大和最小增益
final short minEQLevel = equalizer.getBandLevelRange()[0];
final short maxEQLevel = equalizer.getBandLevelRange()[1];
for (short i = 0; i < bands; i++) {
final short band = i;
//获取当前频段的中心频率,分别为:60Hz,230Hz,910Hz,3600Hz,14000Hz
int currentFreq = equalizer.getCenterFreq(band);
//获取给定均衡器频段的增益
short level = equalizer.getBandLevel(band);
Log.d("Equalizer","currentFreq is: " + currentFreq + ", band level is: " + level);
//为给定的均衡器频带设置增益值
equalizer.setBandLevel(band,xx);
}
在构造函数 Equalizer(int priority, int audioSession) 中:
- int priority:优先级,多个应用可以共享同一 Equalizer 引擎,该参数指出控制优先权,默认为0。
- int audioSession:音频会话 ID,系统范围内唯一,Equalizer 将被附加在拥有相同音频会话 ID 的 MediaPlayer 或 AudioTrack 上生效。
Android 系统预置了一些增益参数,可通过下面代码获取:
short presets= equalizer.getNumberOfPresets();
//获取系统预设的增益
for (short i = 0; i < presets; i++) {
Log.d("presets",equalizer.getPresetName(i));
}
结果为:Normal、Classical、Dance、Flat、Folk、Heavy Metal、Hip hop、Jazz、Pop、Rock。
然后通过 equalizer.usePreset(); 使用系统预置参数。
销毁时:
if (equalizer != null) {
equalizer.setEnabled(false);
equalizer.release();
equalizer = null;
}
1.2 Virtualizer
Virtualizer 的使用方法如下:
Virtualizer mVirtualizer= new Virtualizer (0, mMediaPlayer.getAudioSessionId()); //优先级为0
mVirtualizer.setEnabled(true);
if

最低0.47元/天 解锁文章
725

被折叠的 条评论
为什么被折叠?



