首页 > 解决方案 > WebRTC Mobile - 除非在同一个 wifi 上,否则音频无法正常工作

问题描述

我正在使用 react-native-webrtc 来处理其中的 WebRTC 部分。我正在使用 Websockets 发出信号并使用 ICE 滴流来跟踪 ICE 候选者。

我将我的 ICE 候选人排队,直到在被调用方调用 setLocalDescription。然后我为队列中的每个候选人添加IceCandidate。

在调用方我正在做同样的事情并且在调用 setRemoteDescription 之前不处理我的 ICE 候选人。

我只做音频,所以没有使用视频。

当我在同一网络上使用两台移动设备进行测试时,我没有任何问题。

但是,如果我将一个设备与 WiFi 断开连接,通话仍然可以正常连接,只是在任一设备上都听不到音频。

onConnectionStateChange 处理程序仍将返回“已连接”,而 onIceGatheringStateChanged 仍将返回“完成”。

我想也许我需要使用 TURN 服务器来完成这项工作,所以我开始使用 Twilio 的付费 TURN/STUN 服务器,但问题仍然存在。

有什么想法可以调查吗?

标签: node.jsreact-nativewebsocketwebrtcturn

解决方案


背景

好的,所以您必须了解 RTC 平台上的 P2P 连接的一些背景知识。因此,它开始了(非常简短的版本):

  • 为了建立连接,您必须在两个客户端之间建立直接连接(很明显,我知道)。为了找到这条路线,您需要网络服务器上的帮助。

  • 这就是为什么您设置本地 SDP 并设置我们可以访问的服务器的原因。ICE,TURN,STUN(你可以找到任何信息,例如这个)。现在 ICE 候选是最明显的一个,因为此服务器端点位于您的本地网络中,这就是为什么您的版本不能与不同的网络一起使用。

  • 对,您必须使用 TURN/STUN 来查找 NAT 并纠正对等点之间的路由。大多数 TURN 服务器是私有的和付费的,但对于负载较少的应用程序,您可能会使用公共 STUN 服务器,这就足够了。

你可以在那里找到很多可用的。一个前。在这里

stun.l.google.com:19302
stun1.l.google.com:19302
stun2.l.google.com:19302

解决方案

现在来解决你的问题。如果您认为您已将设备与信号连接起来,这并不意味着您已连接设备。(这只是为了澄清,如果您的设备上没有媒体,则您的 RTC 连接无法建立,而不仅仅是音频)。

在您的设备上使用它的 TURN/STUN 服务器的问题,您必须跟踪在此期间建立 setRemoteDescription的 SDP 并检查服务器是否包含在内。此外,总有一个运行良好的Google 演示

更新

为了跟踪如何设置远程 SDP 和建立连接,oyu 必须打印将用于设置的候选项。为此,您必须打印在 setLocalDescription 和 setRemoteDescription 期间收集的候选人信息。

在您收集候选人的地方添加日志以打印信息。您必须看到,STUN,TURN 候选人将在那里。下面是 Java 中的 ex。ICE这个词不应该打扰你,因为它只是意味着在ICE遍历之后会找到候选人。

// Listen for local ICE candidates on the local RTCPeerConnection
peerConnection.addEventListener('icecandidate', event => {
    if (event.candidate) {
        // Here should be your part where you are sending this candidate to your signaling channel

        // Add logging to print entire candidate information. You should see some data related to ICE, TURN. 
    }
});

推荐阅读