三星设备AcousticEchoCanceler不起作用

我有AcousticEchoCanceler工作VoIP电话为我试过的每一个其他设备types,但不是在任何三星设备。 该设备报告AcousticEchoCanceler可用,但它什么都不做。

我得到了什么:

  • acousticEchoCanceler.setEnabled(true);
  • audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
  • audio会话ID传递给AudioTrack
  • 采样率:16k
  • 尝试了单声道和立体声录音
  • <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  • <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

有没有人有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"); } } 

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

接下来创buildAudioRecord:

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

最后创build并启用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不需要关联到相同的audio会话ID比AudioTrack(我想它应该自动完成)。