2017-10-04 217 views
8

我有AcousticEchoCanceler为每个其他尝试过的设备类型的VoIP呼叫工作,但不能在任何三星设备上工作。该设备报告AcousticEchoCanceler可用,但它什么都不做。三星设备上的AcousticEchoCanceler无法正常工作

我已经有了:

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

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

+0

我注意到它几乎是随机的 - 在某些情况下,AEC适用于三星设备,有时不适用。我仍然没有找到任何理由,相同的代码只是随机工作。 – etan

回答

1

尝试这些行:

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

看起来,单独的代码并没有太大的作用,整个管道需要更改为使用WebRtc音频。我不完全确定如何做到这一点。 – etan

+0

实际上,仅当添加到正确的代码点时,该行似乎可以解决此问题 - 我需要更多测试,但看起来很有希望!另请参阅[Twilio的文档](https://github.com/twilio/video-quickstart-android#configuring-hardware-audio-effects)。 – etan

+0

除了现在它再次打破了三星,没有什么帮助它 – etan

1

我曾经在几年前尝试这种代码,并记住它的工作。无法说明它将如何与最新的设备相匹配。

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"); 
    } 
} 
+0

我有一个类似的代码,但它随机不能在最新的三星设备上工作。 – etan

0

我最近有同样的问题。对我来说最重要的部分是在创建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并不需要关联到高于同期音频会话ID AudioTrack(我想它应该自动完成)。

相关问题