2017-10-04 9 views
8

私が試した他のすべてのデバイスタイプのVoIPコールで動作するAcousticEchoCancelerはありますが、Samsungデバイスでは動作しません。デバイスはAcousticEchoCancelerが利用可能であると報告しますが、単に何もしません。Samsungデバイスの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"/>

Samsungのデバイスで動作するAcousticEchoCancelerはありますか?

+0

私はそれがほとんどランダムであることに気付きました - 場合によっては、AECはSamsungデバイスで動作します。私はまだこれの理由を見つけていない、同じコードはちょうどランダムに動作します。 – 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

私はすでに似たようなコードを持っていますが、最新のSamsungデバイスではランダムに動作しません。 – 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の作成と有効化:AudioTrackがより同じオーディオセッションIDに関連付けられている必要はありません

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(私はそれが自動的に行われるべきだと思います)。

関連する問題