一,基本内容
AudioEffect是定义在音频 Framework 层的一种类(Class),由它派生出了 AcousticEchoCanceler,NoiseSuppressor,AutomaticGainControl,Equalizer、Virtualizer、BassBoost、PresetReverb等派生类。上层开发者使用这些派生类就可以声明相应的 AudioEffect 对象了,再将其应用到 AudioTrack 或 MediaPlayer 实例上进行音效控制。AudioEffect 实际上是一个上层纯软件的概念,通过纯软件的方法对音效进行控制。
二,派生子类
AcousticEchoCanceler(取消回声控制器)
除了从远程捕捉到音频信号上的信号的作用
AutomaticGainControl(自动增益控制)
自动恢复正常捕获的信号输出
NoiseSuppressor(噪声抑制器)
可以消除被捕获信号的背景噪音
Equalizer AudioEffect(均衡器)
均衡器可以被用来改变特定音源输入的频率响应或经混音后的主要输出音频的频率响应。
Virtualizer AudioEffect(示波器)
示波器是对把各个声道进行空间化的这类音效的统称。这类音效的具体行为与设备上输入音频的类型、声道数和输出音频的声道数有关。比如在一个立体声输入、立体声耳机输出的场景中,虚拟器实际执行的是立体声扩展音效。
BassBoost AudioEffect(低音增强器)
低音增强器被用于增强音频中的低频部分,相当于一个只能对低频声音进行增益控制的简单均衡器。
PresetReverb AudioEffect(预设混响器)
一个声音在产生后会往各个方向传播。如果这个声音是在室内产生的,接收方会首先听到音源本身发出的声音,然后听到来自墙壁、天花板和地板的回声。这些回声又会在传播到障碍物上时产生二次回声、三次回声...接收方会持续不断地听到声音,这每一次声音的辨识度越来越低,且响度随时间衰减。混响器(Reverb)对于音频接收者的环境建模非常重要,它可以被用于模拟在不同环境中播放音乐产生的效果,或者在游戏中为玩家生成更加沉浸式的音频体验。APP 可以通过预设混响器提前配置全局的混响参数,这种方式在为音乐播放添加混响效果时被广泛使用。如果 APP 需要配置更高级的环境声混响参数,最好使用环境声混响器来实现。
三,实际应用
AcousticEchoCanceler(取消回声控制器),NoiseSuppressor(自动增益控制),AutomaticGainControl (噪声抑制器)
使用方法:
- 调用静态create()方法创建相应的实例
- 调用isAvailable()方法判断是否可用
- 调用serEnaled(boolean enabled)方法启用相应的效果
代码(如果用其他的类,只需要简单替换即可):
public class MainActivity extends Activity{
Button play;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
play = findViewById(R.id.play);
play.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MediaPlayer mediaPlayer = MediaPlayer.create(MainActivity.this, R.raw.l);
AcousticEchoCanceler acousticEchoCanceler = AcousticEchoCanceler.create(mediaPlayer.getAudioSessionId());
if(acousticEchoCanceler.isAvailable()){ //检查是否可用
//设置取消回声功能
acousticEchoCanceler.setEnabled(true);
}
mediaPlayer.start();
}
});
}
}
Equalizer(均衡器)、Virtualizer(示波器)、BassBoost(低音增强器)、PresetReverb(预设混响器)
使用方法:
- 调用构造器创建实例
- 调用AudioEffect的setEnabled(boolean enable)方法
- 调用自己独特的方法
代码(类的创建方法基本一致,只需要调整seekbar监听里的细节):
BassBoost(低音增强器)
public class PlayActivity extends Activity {
private BassBoost bassBoost = null;
private TextView bassBostTextView;
private SeekBar bassBostSeekBar;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.play);
setupView();
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.l);
bassBoost=new BassBoost(0,mediaPlayer.getAudioSessionId());
mediaPlayer.start();
}
private void setupView() {
bassBostTextView = (TextView) findViewById(R.id.bassBostTextView);
bassBostSeekBar = (SeekBar) findViewById(R.id.bassBostSeekBar);
bassBostSeekBar.setOnSeekBarChangeListener(mBassSeekbarChangerListener);
}
private SeekBar.OnSeekBarChangeListener mBassSeekbarChangerListener = new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if(null!= bassBoost){
bassBoost.setStrength((short)(progress*10));
}
short strength = bassBoost.getRoundedStrength();
boolean isSupported = bassBoost.getStrengthSupported();
bassBostTextView.setText("strength = "+strength+isSupported);
}
public void onStartTrackingTouch(SeekBar seekBar) {
}
public void onStopTrackingTouch(SeekBar seekBar) {
}
};
}
Equalizer(均衡器)
private SeekBar.OnSeekBarChangeListener equalizerSeekBarChangerListener = new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
short bands = equalizer.getNumberOfBands(); //均衡器得到其支持的频谱引擎
//bands=5,这里可以是小于5的任意值,可以for循环设置多个
final short minEqualizer = equalizer.getBandLevelRange()[0]; //最低的限度范围
final short maxEqualizer = equalizer.getBandLevelRange()[1];
System.out.println(minEqualizer+" "+maxEqualizer);
short band = (short)(bands-1);
if(null!= equalizer){
equalizer.setBandLevel(band,(short)(progress*30-1500));
}
// short strength = equalizer.get();
equalizerTextView.setText("strength = "+(short)(progress*30-1500));
}
public void onStartTrackingTouch(SeekBar seekBar) {
}
public void onStopTrackingTouch(SeekBar seekBar) {
}
};
Virtualizer(示波器)
private SeekBar.OnSeekBarChangeListener virtualivzerSeekBarSeekBarChangerListener = new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
short strength = virtualizer.getRoundedStrength();//保存当前的值,方便还原
virtualizer.setStrength((short) (progress*10));
virtualivzerTextView.setText("strength = "+strength);
}
public void onStartTrackingTouch(SeekBar seekBar) {
}
public void onStopTrackingTouch(SeekBar seekBar) {
}
};
PresetReverb(预设混响器)
private SeekBar.OnSeekBarChangeListener presetReverbSeekBarSeekBarChangerListener = new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
presetReverb.setPreset((short)(progress%7));//注意参数PresetReverb.PRESET_LARGEROOM替换可查看源码范围
short strength = presetReverb.getPreset();
presetReverbTextView.setText("strength = "+strength);
}
public void onStartTrackingTouch(SeekBar seekBar) {
}
public void onStopTrackingTouch(SeekBar seekBar) {
}
};