Android在4.1(API level 16)的时候增加了一个API:AcousticEchoCanceler。
官方对此的介绍:【 http://developer.android.com/reference/android/media/audiofx/AcousticEchoCanceler.html 】
AcousticEchoCanceler 继承自【 AudioEffect 】
CONTENTS
下面简单的备忘下AcousticEchoCanceler的使用方法:
1)判断当前机型是否支持AEC,需要注意这里的检查不一定准确。
public static boolean isDeviceSupport() { return AcousticEchoCanceler.isAvailable(); }
2)初始化并使能AEC。
private AcousticEchoCanceler canceler; public boolean initAEC(int audioSession) { if (canceler != null) { return false; } canceler = AcousticEchoCanceler.create(audioSession); canceler.setEnabled(true); return canceler.getEnabled(); }
3)使能/去使能AEC。
public boolean setAECEnabled(boolean enable) { if (null == canceler) { return false; } canceler.setEnabled(enable); return canceler.getEnabled(); }
4)释放AEC。
public boolean release() { if (null == canceler) { return false; } canceler.setEnabled(false); canceler.release(); return true; }
AcousticEchoCanceler的初始化需要一个sessionid,下面简单的备忘下上层的调用方式:
1)初始化AudioRecord的时候需要处理第一个参数。
if (chkNewDev()) { audioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, frequency, channelIN, audioEncoding, tmpSize); }else { audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, channelIN, audioEncoding, tmpSize); }
2)初始化好audioRecord之后,就可以通过
audioRecord.getAudioSessionId()
获取到相应的sessionid。
3)初始化AudioTrack时,也需要额外的处理sessionid。
if (chkNewDev() && audioRecord != null) { audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, frequency, channelOUT, audioEncoding, tmpSize, AudioTrack.MODE_STREAM,audioRecord.getAudioSessionId()); } else { audioTrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL, frequency, channelOUT, audioEncoding, tmpSize, AudioTrack.MODE_STREAM); }
另外,由于API的限制,需要考虑机型不匹配的情况:
public static boolean chkNewDev() { return android.os.Build.VERSION.SDK_INT >= 16; }
权限:
<uses-permission android:name="android.permission.RECORD_AUDIO" />
总结:
1)android新版本增加的API AcousticEchoCanceler 可以非常快速的开发出符合VOIP性质的回声消除程序。但是考虑到各种机型适配,仍然需要第三方的回声消除程序。这里主要推荐两个:webrtc里面的AEC/AECM,speex。
作者成功的在项目中使用了webrtc里面的回声消除,感觉效果还可以。
2)作者编写的上述代码也只是根据官方的介绍编写的,由于资料较少,不能保证代码的正确性。
发表评论