【2013-10-09】Android AcousticEchoCanceler使用笔记
[历史归档]本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。
发布时间:2013-10-09| 标题:Android AcousticEchoCanceler使用笔记|分类:编程 / android |标签:android·ec·AcousticEchoCanceler
Android AcousticEchoCanceler使用笔记
- AcousticEchoCanceler 使用方法
- 1. 检查设备是否支持 AEC
- 2. 初始化并启用 AEC
- 3. 启用 / 禁用 AEC
- 4. 释放 AEC
- 上层调用方式(AudioRecord + AudioTrack)
- 1. 初始化 AudioRecord 时处理音频源
- 2. 获取 sessionId
- 3. 初始化 AudioTrack 时绑定相同 sessionId
- 总结
Android 在4.1(API level 16)新增了AcousticEchoCancelerAPI,继承自 AudioEffect,可快速实现 VOIP 场景下的回声消除。
官方文档:AcousticEchoCanceler
AcousticEchoCanceler 使用方法
1. 检查设备是否支持 AEC
注意:此检查结果不一定准确,需结合实际机型测试。
publicstaticbooleanisDeviceSupport(){returnAcousticEchoCanceler.isAvailable();}2. 初始化并启用 AEC
privateAcousticEchoCancelercanceler;publicbooleaninitAEC(intaudioSession){if(canceler!=null){returnfalse;}canceler=AcousticEchoCanceler.create(audioSession);canceler.setEnabled(true);returncanceler.getEnabled();}3. 启用 / 禁用 AEC
publicbooleansetAECEnabled(booleanenable){if(null==canceler){returnfalse;}canceler.setEnabled(enable);returncanceler.getEnabled();}4. 释放 AEC
publicbooleanrelease(){if(null==canceler){returnfalse;}canceler.setEnabled(false);canceler.release();returntrue;}上层调用方式(AudioRecord + AudioTrack)
AcousticEchoCanceler 初始化需要audioSessionId,以下是上层的配合方式。
1. 初始化 AudioRecord 时处理音频源
if(chkNewDev()){audioRecord=newAudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION,frequency,channelIN,audioEncoding,tmpSize);}else{audioRecord=newAudioRecord(MediaRecorder.AudioSource.MIC,frequency,channelIN,audioEncoding,tmpSize);}2. 获取 sessionId
audioRecord.getAudioSessionId()3. 初始化 AudioTrack 时绑定相同 sessionId
if(chkNewDev()&&audioRecord!=null){audioTrack=newAudioTrack(AudioManager.STREAM_VOICE_CALL,frequency,channelOUT,audioEncoding,tmpSize,AudioTrack.MODE_STREAM,audioRecord.getAudioSessionId());}else{audioTrack=newAudioTrack(AudioManager.STREAM_VOICE_CALL,frequency,channelOUT,audioEncoding,tmpSize,AudioTrack.MODE_STREAM);}版本检查工具方法:
publicstaticbooleanchkNewDev(){returnandroid.os.Build.VERSION.SDK_INT>=16;}所需权限:
<uses-permissionandroid:name="android.permission.RECORD_AUDIO"/>总结
AcousticEchoCanceler可快速实现 VOIP 回声消除,但各机型适配参差不齐,建议同时准备第三方方案(如 WebRTC AEC/AECM、Speex)。- 上述代码基于官方文档编写,资料较少,不保证完整正确性。
