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