如何在连接到多个音频通道时解决Android webRTC音频中的Echo

Div*_*egi 11 debugging android echo webrtc

我一直在使用libjingle在四个用户之间建立对等连接以共享数据并启动音频通道.大部分时间都可以正常工作,但是有一个用户的回声问题,这使得呼叫非常不稳定并且很难听取用户的意见.

我试过添加

this.mediaConstraints.optional.add(new MediaConstraints.KeyValuePair("googNoiseSuppression", "true"));
this.mediaConstraints.optional.add(new MediaConstraints.KeyValuePair("googEchoCancellation", "true"));
Run Code Online (Sandbox Code Playgroud)

我在可选参数中添加这些约束,以防我在强制中添加它们断开调用并抛出onRenegotiationNeeded方法.

我列举了一些案例,例如:

1)这可能是1个用户处于扬声器(或耳机足够大)的原因,语音在麦克风中注册并产生回声.(但有时它也没有这个原因)

2)可能有1个音频通道注册两次,并创建一个混响效果,同一用户发送两次数据通道.(无法找到如何调试,我计算音频通道,它们是正常的)

3)两个用户在同一个房间并且发生回声(这是正常情况发生但不是一个问题,因为它不可避免)

我正在寻找建议或解决方案,以防其他人遇到Android webRTC库的此类问题.

implementation 'io.pristine:libjingle:9694@aar'
Run Code Online (Sandbox Code Playgroud)

我起诉的图书馆是这样的,但我也发现最近的webRTC官方图书馆最近更新了,会迁移到那个解决任何这样的问题吗?

我找到的最新图书馆是:

implementation 'org.webrtc:google-webrtc:1.0.22672'
Run Code Online (Sandbox Code Playgroud)

任何帮助将受到高度赞赏.

谢谢

Som*_*mar 5

较新版本的 WebRTC 具有WebRtcAudioUtils可用于基于 WebRTC 的声学回声消除 (AEC) 的类。

在这里您有两种选择,您可以使用内置 AEC 或基于 WebRTC 的 AEC。

//Disable built-in AEC even if device doesn't supports it
WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(true);
Run Code Online (Sandbox Code Playgroud)

或者

//Enable built-in AEC if device supports it"
 WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(false);
Run Code Online (Sandbox Code Playgroud)

我认为 pristine 不再维护 android WebRTC 库了。因此,我建议您使用由 Google 托管的新 WebRTC 库,因为许多错误修复仅在撰写本文时 Google 托管的 WebRTC 库的新版本中可用

implementation 'org.webrtc:google-webrtc:1.0.22920'
Run Code Online (Sandbox Code Playgroud)

我很难将基于原始的 WebRTC 项目迁移到基于 Google 的 WebRTC 库,因为许多类已被弃用,其中一些甚至不在较新版本的 WebRTC 中。您可以查看我的 GitHub 项目,该项目AppRTC的客户端,我在其中使用了来自 Google 的 WebRTC 预构建库或googlesource.com 上的Checkout官方 android 示例。在PeerConnectionClient课堂上,他们还使用WebRtcAudioUtils切换回声以及噪声、高通滤波器等。