Android应用开发-回声消除AEC
基本流程:例化AudioRecord进行录音,保存音频文件为pcm格式;然后例化AudioTrack进行播放;
1.VOICE_COMMUNICATION
AudioRecord参数配置:
将AudioRecord的MediaRecorder.AudioSource.MIC参数修改成MediaRecorder.AudioSource.VOICE_COMMUNICATION
AudioManager参数配置:
录音开始前:
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setSpeakerphoneOn(true);
录音结束后:
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setSpeakerphoneOn(false);
权限配置:
注意:保存在应用程序内部存储,不需要申请外部读写权限;
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
2.WebRTC
(1)直接导入WebRTC官方aar,无法使用
在项目的build.gradle中添加
`implementation 'org.webrtc:google-webrtc:1.0.32006'`
在工程的settings.gradle中添加jcenter(),保证依赖库可以下载;
jcenter()
mavenCentral()
(2)原因
因为官方aar封装了audioRecord,所以无法进行本地音频保存;需要修改WebRTC源码库然后重新编译或者去网上找已经编译好的库直接使用;
(3)参考链接
https://juejin.cn/post/7036956266752639012 《Android端WebRTC本地音视频采集流程源码分析》
https://www.jianshu.com/p/6030ee4b64c3 《android 用WebRTC做回音消除》
3.Speex
没有测试过;
4.AcousticEchoCanceler
首先通过AcousticEchoCanceler.isAvailable()判断手机是否支持;
创建android.media.AudioRecord 的对象的时候,可以通过这个对象获取到一个audio session 的ID(获取的方法:getAudioSessionId()),这个ID的话在创建AcousticEchoCanceler的时候用到(创建对象:AcousticEchoCanceler.create(audioSessionId)),最后播放音频的时候(这里是用AudioTrack播放)传入这个ID就行。
实测:虽然oppo手机显示支持,但是没有效果;
总结
第一种方式更方便简单;通用性更强;