android 使用实现音效--Equalizer

均衡器用于改变特定音乐源或主输出混音的频率响应。应用程序创建一个均衡器对象来实例化和控制音频框架中的均衡器引擎。应用程序可以简单地使用预定义的预设,也可以更精确地控制均衡器控制的每个频带中的增益。频率范围从低到高包括:超低频、低频、中频、高频、超高频。

均衡器在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) 
相关推荐
西瓜本瓜@2 小时前
在Android中如何使用Protobuf上传协议
android·java·开发语言·git·学习·android-studio
似霰6 小时前
安卓adb shell串口基础指令
android·adb
fatiaozhang95278 小时前
中兴云电脑W102D_晶晨S905X2_2+16G_mt7661无线_安卓9.0_线刷固件包
android·adb·电视盒子·魔百盒刷机·魔百盒固件
CYRUS_STUDIO9 小时前
Android APP 热修复原理
android·app·hotfix
鸿蒙布道师9 小时前
鸿蒙NEXT开发通知工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
鸿蒙布道师9 小时前
鸿蒙NEXT开发网络相关工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
大耳猫9 小时前
【解决】Android Gradle Sync 报错 Could not read workspace metadata
android·gradle·android studio
ta叫我小白10 小时前
实现 Android 图片信息获取和 EXIF 坐标解析
android·exif·经纬度
dpxiaolong11 小时前
RK3588平台用v4l工具调试USB摄像头实践(亮度,饱和度,对比度,色相等)
android·windows
tangweiguo0305198712 小时前
Android 混合开发实战:统一 View 与 Compose 的浅色/深色主题方案
android