AcousticEchoCanceler на устройствах Samsung не работает

У меня AcousticEchoCanceler, работающий для звонков VoIP для всех других типов устройств, которые я пробовал, но не на любом устройстве Samsung. Устройство сообщает о доступности AcousticEchoCanceler, но оно просто ничего не делает.

Что у меня есть:

  • acousticEchoCanceler.setEnabled(true);
  • audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
  • Идентификатор аудио сеанса передан AudioTrack
  • Частота дискретизации: 16 КБ
  • Пробовал как моно так и стерео запись
  • <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  • <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>

Кто-нибудь получил AcousticEchoCanceler для работы на устройстве Samsung?

3 ответа

У меня недавно была такая же проблема. Самой важной частью для меня было использование audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION) перед созданием AudioRecord.

Затем 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 (я полагаю, это должно быть сделано автоматически).

Я пробовал этот код несколько лет назад и помню, что он работал. Не могу сказать, как он будет жить с последними устройствами.

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

Попробуйте эти строки:

if (AcousticEchoCanceler.isAvailable() && WebRtcAudioUtils.isAcousticEchoCancelerSupported()) {
                WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(true);
                WebRtcAudioUtils.useWebRtcBasedAcousticEchoCanceler();
            }
Другие вопросы по тегам