我的 Voip 应用程序使用 OpenSL/ES(Android NDK API)进行麦克风和扬声器控制。 但回声消除器在此应用程序上不起作用。 当我打电话时,我听到回声。
我正在研究如何在此应用程序上启用回声消除功能。
OpenSL/ES 定义了一个名为 SLEchoSuppressorItf 的接口,通过使用它,似乎可以取消 Voip 呼叫中出现的回声。
但是,SLEchoSuppressorItf 在完整规格的 OpenSL/ES 中有效,我发现它在 Android 版本的 OpenSL 中没有实现。
因此,我尝试使用 Java API 的 AcousticEchoCanceler 类代替 SLEchoSuppressorItf(OpenSL/ES) 来看看它是否有效。 下面是它的源代码。
int bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT);
// Create AudioRecord object
audioRecord = new AudioRecord(MediaRecorder.AudioSource.VOICE_COMMUNICATION,
SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT, bufferSize);
//Confirm AcousticEchoCanceler is available on this device
if (AcousticEchoCanceler.isAvailable())
{
// Create AcousticEchoCanceler instance
echoCanceler = AcousticEchoCanceler.create(audioRecord.getAudioSessionId());
// Enabel echo canceler
if (echoCanceler != null) {
echoCanceler.setEnabled(true);
Logger.log(Log.DEBUG, "CallManagerState", "AcousticEchoCanceler setEnabled");
}
}
但是,当我也执行此代码时,回声消除器不起作用。 (当我打电话时,我又听到回声)
[问题1] Java API 的 AcousticEchoCanceler 是否仅对 Java API 的 AudioRecord 实例有效? 换句话说,Java API 的 AcousticEchoCanceler 对 OpenSL/ES(Android NDK API) 实例没有影响吗?
[问题2] 如果问题 1 为“是”,如何在使用 OpenSL/ES(Android NDK API) 实现的 VoIP 应用程序中启用回声消除器?
请注意,AEC 可能可以工作,但无法处理您的环境/设置 - 例如很长的回声尾部。请参阅以下帖子https://solicall.com/analyze-the-echo-path-yourself/