WEBRTC,不能在不同网络之间工作

WEBRTC, not working between different nets

我正在开发一个简单的应用程序,它使用 webrtc 在一个方向(一个发送器和一个接收器)传输实时视频。它使用 socket.io 和 node.js 作为信号。

此时发送端和接收端在同一个网络(服务器已经在线)的情况下可以传输实时视频,但是如果我使用移动网络或者对端连接在不同的wifi中它不起作用。 实际上,我使用 public 图书馆的 wifi 和我家的 wifi 进行了测试,当发件人处于 public wifi 时,它工作正常。

我在 firefox 失败时收到的消息是: ICE 失败,请参阅 about:webrtc 了解更多详细信息

据我所知,webrtc 使用 STUN/TURN 服务器来解决 net 的 NATS 问题。我从 STUN 和 TURN 服务器引入了 url,但似乎没有效果。

这就是我 'using' STUN/TURN 服务器的方式:

var configuration = { iceServers: [
{
    urls: "turn:numb.viagenie.ca",
    username: "xxxxxxxx@hotmail.com",
    credential: "********"
},
{
    urls: "stun:stun.callwithus.com"
}
]};
var pc = new RTCPeerConnection(configuration);

双方都一样,看来服务器已经启动了。

所以,我的最后一个问题是,我需要做一些其他事情来确保 webrtc 在需要时使用 STUN/Turn 服务器吗? 或者,您是否知道此行为的任何其他可能原因?

你知道的一切都会有很大帮助,因为我找不到如何使用这些服务器。

如果您需要更多信息,请索取。

T

是的,您需要收听 pc.onicecandidate 并通过您的信号通道将每个候选人发送到另一端,如果使用 adapter.js,您可以像这样调用 pc.addIceCandidate :

pc.addIceCandidate(candidate).catch(e => console.log(e))

或者如果不是这样(旧语法):

pc.addIceCandidate(new RTCIceCandidate(candidate)).catch(e => console.log(e))

您也可以转储 ICE 候选人,看看您的设置是否有效(srflx = stun,relay = turn):

var PC = window.RTCPeerConnection || window.webkitRTCPeerConnection;
var server = { urls: "stun:stun.l.google.com:19302" };
var pc = new PC({ iceServers: [server] });

pc.onicecandidate = e => e.candidate && console.log(e.candidate.candidate);

pc.createDataChannel("dummy");
pc.createOffer().then(d => pc.setLocalDescription(d)).catch(e => console.log(e));

您可以修改该代码段以包含您的回合服务器。

console logs of failed comunication

这是我在控制台中获得的示例。似乎使用了 srflx 和中继,但在某些时候我得到了一个空候选,屏幕截图上的错误是因为我正在尝试记录一个空对象的 'candidate' 属性。

终于,问题解决了。 似乎 Turn 服务器运行不正常。我在xyrsis上做了个试用账号,改了stun和turn服务器就解决了

谢谢大家