均衡器用于改变特定音乐源或主输出混音的频率响应。应用程序创建一个均衡器对象来实例化和控制音频框架中的均衡器引擎。应用程序可以简单地使用预定义的预设,也可以更精确地控制均衡器控制的每个频带中的增益。频率范围从低到高包括:超低频、低频、中频、高频、超高频。
均衡器在Android 9之前跟之后是不同实现,Android 9之前只有五段,Android 9后有10段。均衡器默认有古典、舞蹈、民俗、重金属、嘻哈、爵士、流行、摇滚等风格。十段值是31, 62, 125, 250, 500, 1000, 2000, 4000, 8000, 16000。
1. 均衡器权限
实现Eq需要动态添加Manifest.permission.RECORD_AUDIO权限
java
<uses-permission android:name="android.permission.RECORD_AUDIO" />
2. Android 9之前的五段音效实现
sessionId是通过MediaPlayer获取的mMediaPlayer.getAudioSessionId(),如果sessionId为0表示全局控制,即可以控制其它音乐播放器或者视频的播放音效。eqValue就是五段音效每段的值,可以预设,也可以自己设置一个seekbar动态去调节每段的值,从小到大分别是低音到高音。
java
mEqualizer = new Equalizer(1000, mSessionId);
mEqualizer.setEnabled(true);
int[] eqValue = new int[]{300, 0, 0, 0, 300};
for (int i = 0; i < eqValue.length; i++) {
mEqualizer.setBandLevel((short) i, (short) eqValue[i]);
}
用完需要去释放,使用mEqualizer.setEnabled(false)去设置打开关闭音效
java
if (mEqualizer != null) {
mEqualizer.setEnabled(false);
mEqualizer.release();
mEqualizer = null;
}
3. 十段音效实现
十段音效初始化比较复杂一点,可以预设10个值,也可以设置10个Seekbar去分别调节十个频率。
java
val mBandVal = intArrayOf(31, 62, 125, 250, 500, 1000, 2000, 4000, 8000, 16000)
val maxBandCount = mBandVal.size
private var mDynamics: DynamicsProcessing? = null
private var mDynamicsEq: Eq? = null
private var mNewValues: IntArray? = null
private val PRIORITY = 1000
private val mNewEqDefaultValues = intArrayOf(4, 2, 2, 0, -1, 3, 4, 1, 1, 3)
private var mCurrentEqValue = mNewEqDefaultValues
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
val builder =
DynamicsProcessing.Config.Builder(
mVariant,
mChannelCount,
true,
maxBandCount,
true,
maxBandCount,
true,
maxBandCount,
true
)
mDynamics = DynamicsProcessing(0, mSessionId, builder.build())
mDynamics?.enabled = true
mDynamicsEq = Eq(true, true, maxBandCount)
mDynamicsEq?.isEnabled = true
mNewValues = IntArray(maxBandCount)
for (i in 0 until maxBandCount) {
mNewValues!![i] = mNewEqDefaultValues[i]
}
for (i in 0 until maxBandCount) {
mDynamicsEq?.getBand(i)?.cutoffFrequency = mBandVal[i].toFloat()
setDynamicsValue(i, mNewValues!![i])
mDynamics?.setPreEqAllChannelsTo(mDynamicsEq)
}
}
设置10条音效值
java
/**
* 设置10条eq
*
* @param band 第几条
* @param level 调节值大小
*/
fun setDynamicsValue(band: Int, level: Int) {
if (mNewValues == null) {
LogUtils.i(TAG, "setDynamicsValue value is null")
return
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
mNewValues!![band] = level
if (mDynamics != null && mDynamicsEq != null) {
mDynamicsEq!!.getBand(band).gain = mNewValues!![band].toFloat()
mDynamics!!.setPreEqBandAllChannelsTo(band, mDynamicsEq!!.getBand(band))
}
}
}
释放资源需要将enabled设置为false并调用release()方法去释放
java
fun release() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
mDynamics?.let {
it.enabled = false
it.release()
}
mDynamics = null
}
}
想要详细了解可以去看谷歌文档:Equalizer | Android Developers
4. 超重低音BassBoost实现
重低音BassBoost,重低音又称为低音增强,重低音是一种放大或增强低频声音的音频效果,它类似于简单的均衡器,只是限于低频范围内的频带放大。调用mBassBoost?.setStrength(value.toShort())来调节放大等级。
java
if (mSessionId != 0) {
mBassBoost = BassBoost(1000, mSessionId)
mBassBoost!!.enabled = true
if (mBassBoost!!.strengthSupported) {
mBassBoost!!.setStrength(value.toShort())
}
}
//释放
if (mBassBoost != null) {
mBassBoost.setEnabled(false);
mBassBoost.release();
mBassBoost = null;
}
源码地址:BassBoost | Android Developers
5. 预设音效PresetReverb
预设混响PresetReverb,根据官方介绍,房间内产生的声音会向多个方向传播。听众首先听到来自声源本身的直达声音。之后,他或她会听到声音从附近的墙壁、天花板和地板反射而产生的离散回声。随着声波经过越来越多的反射到达,单个反射变得难以区分,听众听到的连续混响会随时间衰减。混响对于模拟听众的环境至关重要。它可以用于音乐应用程序中,以模拟在各种环境中播放的音乐,也可以用于游戏中,让听众沉浸在游戏环境中。PresetReverb 类允许应用程序使用混响预设配置全局混响。这主要用于在音乐播放环境中添加一些混响。建议需要控制更高级环境混响的应用程序使用该类android.media.audiofx.EnvironmentalReverb。应用程序创建一个 PresetReverb 对象来实例化和控制音频框架中的混响引擎。
混响参数包括:房间大小、高频衰减系数、延时大小、干湿比、立体声宽度等。
预设混响包括小房间、中等房间、大房间、中等大厅、宽敞大厅等,具体可以通过PresetReverb方法去获取
java
PresetReverb.PRESET_NONE
PresetReverb.PRESET_SMALLROOM
PresetReverb.PRESET_MEDIUMROOM
PresetReverb.PRESET_LARGEROOM
PresetReverb.PRESET_MEDIUMHALL
PresetReverb.PRESET_LARGEHALL
PresetReverb.PRESET_PLATE
设置PresetReverb音效
java
mReverb = new PresetReverb(0, 0);
mReverb.setPreset(mReverbValue);
mReverb.setEnabled(true);
mMediaPlayer.attachAuxEffect(mReverb.getId());
mMediaPlayer.setAuxEffectSendLevel(1.0f);
用完释放需要调用release方法
java
if (mReverb != null) {
mReverb.setEnabled(false);
mReverb.release();
mReverb = null;
}
详细可以看谷歌文档:PresetReverb | Android Developers
6. 自定义音效
这里只是介绍10段音效,五段同理,可以用seekbar实现10段频率音效,然后去调节每个,再记录不同的值,可以参考酷狗音乐等的音效去设置差不多的值,然后记录下来,再设置进去即可。
这里调了两个音效,实际可以发挥自己想象力跟音乐细胞创作无限音效。
java
private val bass= intArrayOf(10, 10, 10, 10, 10, 10, 10, 10, 10, 10)
private val lively= intArrayOf(0, 0, 15, 15, 15, 30, 30, 30, 0, 0)