如何在 Android Voip 应用程序上启用回声消除功能?

问题描述 投票:0回答:1

我的 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 应用程序中启用回声消除器?

android-ndk android-audiorecord opensl audioeffect echo-cancellation
1个回答
0
投票

请注意,AEC 可能可以工作,但无法处理您的环境/设置 - 例如很长的回声尾部。请参阅以下帖子https://solicall.com/analyze-the-echo-path-yourself/

© www.soinside.com 2019 - 2024. All rights reserved.