Node.js WebRTC Mobile-音频不工作,除非在同一wifi上

Node.js WebRTC Mobile-音频不工作,除非在同一wifi上,node.js,react-native,websocket,webrtc,turn,Node.js,React Native,Websocket,Webrtc,Turn,我正在使用react native webrtc来处理此文件的webrtc部分。 我正在使用WebSocket来发出信号,并使用冰流来跟踪ICE候选者 我将ICE候选对象排队,直到在被叫方调用setLocalDescription。然后,我为队列中的每个候选人添加候选日期 在调用方,我也在做同样的事情,在调用setRemoteDescription之前不处理ICE候选对象 我只做音频,所以没有视频被使用 当我在同一网络上用两台移动设备测试时,我没有问题 但是,如果我断开一台设备与WiFi的连接,

我正在使用react native webrtc来处理此文件的webrtc部分。 我正在使用WebSocket来发出信号,并使用冰流来跟踪ICE候选者

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

在调用方,我也在做同样的事情,在调用setRemoteDescription之前不处理ICE候选对象

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

当我在同一网络上用两台移动设备测试时,我没有问题

但是,如果我断开一台设备与WiFi的连接,电话仍然可以正常连接,除了在任何一台设备上都听不到音频

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

我想也许我需要使用一个回合服务器来实现这一点,所以我开始使用Twilio的付费回合/眩晕服务器,但问题仍然存在

有什么想法吗?

背景

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

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

  • 这就是为什么要用设置设置本地SDP,我们可以访问哪个服务器。冰、转身、眩晕(例如,你可以找到任何信息)。现在ICE选择了最明显的一个,因为此服务器在本地网络中终结,这就是为什么您的版本不能与不同的网络一起工作

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

你可以在那里找到很多。一个例子

解决方案

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

在您的设备上使用it的TURN/STUN服务器时出现问题,您必须跟踪在
setRemoteDescription
期间建立的SDP,并检查服务器是否包括在内。此外,始终存在一个工作正常的系统

更新

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

在收集候选人的地方添加日志以打印信息。你必须看到,那个令人眩晕的候选人将会出现。下面是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. 
    }
});

你好,Genesa,我正在使用Twilio的付费眩晕/转身服务器。建立我的RTPeerConnection时(3圈1眩晕服务器)。你能详细解释一下你的意思吗:“在你的设备上使用it的TURN/STUN服务器的问题,你必须跟踪setRemoteDescription期间建立的SDP,并检查服务器是否包括在内。”@mocode10 1。在这种情况下,请跳过使用TURN服务器,因为在使用专用TURN服务器时可能会有一些警告。上面的问题是关于在不同网络之间路由2对等连接的。2.您需要调试SDP信息,这些信息是在
setRemoteDescription
期间在本地设置的。只需在日志中打印即可查看,如果SDP中有眩晕/转身服务器。Genesa你能提供一个例子说明眩晕/转身服务器如何出现在SDP对象中吗?c=在IP4 0.0.0中a=rtcp:9在IP4 0.0.0中a=ice ufrag:oC9F a=ice pwd是我所拥有的,但我没有看到我实际的眩晕服务器端点。@mocode10我希望你真的解决了你的问题。因为若它和STUN服务器无关(它们是提供给SDP的),那个么问题可能会更复杂。无论如何,请随意查看WebRTC示例。
// 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. 
    }
});