三星设备上的AcousticEchoCanceler无法正常工作

我有AcousticEchoCanceler用于我试过的所有其他设备types的VoIP呼叫,但不在任何三星设备上。 该设备报告AcousticEchoCanceler可用,但它什么都不做。

我得到了什么:

  • acousticEchoCanceler.setEnabled(true);
  • audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
  • 音频会话ID传递给AudioTrack
  • 采样率:16k
  • 尝试单声道和立体声录音

有没有人让AcousticEchoCanceler在三星设备上工作?

试试这些:

 if (AcousticEchoCanceler.isAvailable() && WebRtcAudioUtils.isAcousticEchoCancelerSupported()) { WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(true); WebRtcAudioUtils.useWebRtcBasedAcousticEchoCanceler(); } 

几年前我曾尝试过这段代码并记住它有效。 不能说它将如何与最新的设备。

 int audioSource = MediaRecorder.AudioSource.VOICE_COMMUNICATION; int sampleFreq = 16000; int numChannels = 1; int numBytesPerSample = 2; int channelConfig = numChannels == 1 ? AudioFormat.CHANNEL_IN_MONO : AudioFormat.CHANNEL_IN_STEREO; int audioFormat = numBytesPerSample == 2 ? AudioFormat.ENCODING_PCM_16BIT : AudioFormat.ENCODING_PCM_8BIT; int bufSize = AudioRecord.getMinBufferSize(sampleFreq, channelConfig, audioFormat); if (bufSize == AudioRecord.ERROR_BAD_VALUE || bufSize == AudioRecord.ERROR) { return; } AudioRecord audioInRecord = new AudioRecord(audioSource, sampleFreq, channelConfig, audioFormat, bufSize); if (audioInRecord.getState() != AudioRecord.STATE_INITIALIZED) { return; } boolean aecAvailable = AcousticEchoCanceler.isAvailable(); if (aecAvailable) { AcousticEchoCanceler instance; if((instance = AcousticEchoCanceler.create(audioInRecord.getAudioSessionId())) != null) { instance.setEnabled(true); Log.d(TAG, "AEC enabled"); } else { Log.d(TAG, "AEC disabled"); } } 

我最近遇到了同样的问题。 对我来说最重要的部分是在创建AudioRecord之前使用audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION)。

接下来创建AudioRecord:

 mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION, mSamplingRate, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, audioRecordBufferSize); 

最后创建并启用NS和AEC:

 mNoiseSuppressor = NoiseSuppressor.create(mAudioRecord.getAudioSessionId()); if (mNoiseSuppressor != null) { int res = mNoiseSuppressor.setEnabled(true); } mAcousticEchoCanceler = AcousticEchoCanceler.create(mAudioRecord.getAudioSessionId()); if (mAcousticEchoCanceler != null) { int res = mAcousticEchoCanceler.setEnabled(true); } 

AudioTrack不需要与AudioTrack相关联的音频会话ID(我想它应该自动完成)。