2017-10-04 21 views
8

AcousticEchoCanceler, denediğim ama hiçbir Samsung cihazında değil, denediğim diğer tüm cihaz türleri için VoIP aramaları için çalışıyor. Cihaz, AcousticEchoCanceler'ın mevcut olduğunu bildiriyor ancak sadece bir şey yapmıyor.Samsung cihazlarda AcousticEchoCanceler çalışmıyor

bende Ne:

  • acousticEchoCanceler.setEnabled(true);
  • audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
  • Ses oturum kimliği AudioTrack
  • Numune oranına geçti: 16k
  • çalıştı mono ve stereo kayıt hem
  • <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  • <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

Samsung aygıtında çalışmak isteyen var mı AcousticEchoCanceler?

+0

Neredeyse rastgele olduğunu fark ettim - bazı durumlarda AEC Samsung cihazları üzerinde çalışıyor, bazen değil. Hala bunun için bir sebep bulamadım, aynı kod sadece rastgele çalışıyor. – etan

cevap

1

bu satırları deneyin: Birkaç yıl önce bu kodu çalıştı

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

Bu kodun tek başına çok fazla işlem yapmadığı göz önüne alınırsa, WebRtc sesini kullanmak için tüm boru hattının değiştirilmesi gerekir. Ve bunu nasıl yapacağından tam olarak emin değilim. – etan

+0

Gerçekte, kodun doğru noktasına eklendiğinde bu satırın şimdilik sorunu çözdüğü görülüyor - daha fazla sınamaya ihtiyacım var ama şimdiye kadar umut verici görünüyor! Ayrıca bunun hakkında [Twilio's doc] 'a (https://github.com/twilio/video-quickstart-android#configuring-hardware-audio-effects) bakınız. – etan

+0

Artık hariç Samsung tekrar bozuldu ve artık hiçbir şey ona yardım etmiyor – etan

1

ve işe yaradı unutmayın. En son cihazlarla nasıl ücret alacağını söyleyemem.

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

Ben zaten benzer bir kod var, ama rastgele son Samsung cihazlar üzerinde çalışmıyor. – etan

0

Son zamanlarda aynı sorunu yaşadım. Benim için en önemli bölüm AudioRecord'u oluşturmadan önce audioManager.setMode (AudioManager.MODE_IN_COMMUNICATION) kullanmaktı. AEC'yi oluşturmak ve NS ve etkinleştirmek nihayet

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

Ve:

Sonraki AudioRecord ile oluşturuldu

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 gerekmez daha aynı Ses oturum kimliğine ilişkili olduğu AudioTrack (Sanırım otomatik olarak yapılmalı).

İlgili konular