Android AudioEffect 音效方案

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 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ByteSaid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值