解决Android原生回声消除某些机型无效的正确姿势
2024-11-20 10:57:26
michael007js
6
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);