随笔博文

福利推荐-办理成功后可加微信领取20红包

解决Android原生回声消除某些机型无效的正确姿势

2024-11-20 10:57:26 michael007js 11

项目场景:

Android回声消除可以使用原生和第三方,第三方比如:speex、webrtc aecm,但是个人觉得使用原生最简单,效果也好。


问题描述

使用Android原生消除回声时,如果使用不当会造成某些机型是无效的。以下代码在三星s20、vivo的某些机型就会出现无效的现象。

minBufferSize = android.media.AudioRecord.getMinBufferSize(sampleRate, channelConfig, AudioFormat.ENCODING_PCM_16BIT);
bitRate       = sampleRate*AudioFormat.ENCODING_PCM_16BIT*channels;
audioRecord = new android.media.AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION,//自带消除回声
               sampleRate,
               channelConfig,
               AudioFormat.ENCODING_PCM_16BIT, minBufferSize);
123456

原因分析:

有些机型默认音频模式是MODE_NORMAL,而不是MODE_IN_COMMUNICATION


解决方案:

必须通过AudioManager设置模式为MODE_IN_COMMUNICATION,并且AudioRecord的模式也设置成MODE_IN_COMMUNICATION,代码如下:

audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setSpeakerphoneOn(true);

audioRecord = new android.media.AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION,//自带消除回声
               sampleRate,
               channelConfig,
               AudioFormat.ENCODING_PCM_16BIT, minBufferSize);



首页
关于博主
我的博客
搜索