如何配置 WebRTC 以连接到我的 TURN 服务器?

How do I configure WebRTC to connect to my TURN server?

我正在处理一个非常基本的 WebRTC 项目,但我似乎无法让我的网站连接到我的 TURN 服务器。我在我的本地机器 (MacOS 10.15.4) 上使用 coturn 设置了 TURN 服务器,我很确定它的工作和配置正确。 (当我从 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/ 测试它时,我可以从我的本地网络内部和外部看到一个 rtp 主机、rtp srflx 和一个 rtp 中继,所以我假设这意味着它按预期工作。)

该网站是 this codelab's step 5 example 的略微修改版本,其中 node.js index.js 文件略有修改以通过 https 托管该站点,以允许从本地网络外部访问网络摄像头.

只要两个客户端都在同一网络上(因此不需要 TURN 服务器),一切正常,但是一旦其中一个客户端尝试从另一个网络连接到另一个客户端,PeerConnection 就不会' 正确建立并且两个客户端只能看到他们自己的 localStream。

我认为网站上的 JavaScript 缺少某些内容,因为当我从 webrtc.github.io 示例测试 TURN 服务器时,我在终端中看到了 TURN 服务器的输出:

4271: session 005000000000000002: realm <test> user <>: incoming packet BINDING processed, success
4271: session 005000000000000002: realm <test> user <>: incoming packet message processed, error 401: Unauthorized
4271: IPv4. Local relay addr: 192.168.xxx.xxx:61944
4271: session 005000000000000002: new, realm=<test>, username=<test>, lifetime=600
4271: session 005000000000000002: realm <test> user <test>: incoming packet ALLOCATE processed, success
4271: session 005000000000000002: refreshed, realm=<test>, username=<test>, lifetime=0
4271: session 005000000000000002: realm <test> user <test>: incoming packet REFRESH processed, success
4272: session 005000000000000002: usage: realm=<test>, username=<test>, rp=4, rb=224, sp=4, sb=380
4272: session 005000000000000002: peer usage: realm=<test>, username=<test>, rp=0, rb=0, sp=0, sb=0
4272: session 005000000000000002: closed (2nd stage), user <test> realm <test> origin <>, local 192.168.xxx.xxx:3478, remote 192.168.xxx.xxx:62569, reason: allocation timeout
4272: session 005000000000000002: delete: realm=<test>, username=<test>

(显然 xxx 是实际输出中的实际数字)

然而,当不同网络上的两个客户端尝试加载页面并启动对等连接时,我的终端中根本没有从 coturn 获得任何输出,所以我猜我网站的 JavaScript 是丢失并且它没有使用我的 TURN 服务器。这是目前网站上所有与TURN服务器相关的代码:

var pcConfig = {
    'iceServers': [
        {
            'urls': 'stun:stun.l.google.com:19302'
        },
        {
            'urls': 'turn:xxx.xxx.xxx.xxx:3478',     <-- (my external IP address)
            'username': 'test',
            'password': 'test',
        }
    ]
};
if (location.hostname !== 'localhost') {
    console.log("Requesting TURN server...");
    requestTurn();
}
function requestTurn() {
  var turnExists = false;
  for (var i in pcConfig.iceServers) {
    if (pcConfig.iceServers[i].urls.substr(0, 5) === 'turn:') {
      turnExists = true;
      turnReady = true;
      console.log("Turn ready at: " + pcConfig.iceServers[i].urls);
      break;
    }
  }
  if (!turnExists) {
    console.log("No TURN server found");
  }
}

在控制台中,我看到消息 Requesting TURN server...Turn ready at: turn:xxx.xxx.xxx.xxx:3478

但是由于我在终端中没有从我的 TURN 服务器获得任何输出,我猜测该网站实际上根本没有向 TURN 服务器发出请求。我的客户端可能遗漏了一些明显的东西 JavaScript,但我不知道是什么,所以我希望有人能提供一些想法并提供帮助!

所以...事实证明这是一个愚蠢的问题。

经过长时间的调试之后,我愿意承认,事实证明,在创建新的 RTCPeerConnection 时,我定义 TURN 服务器的 pcConfig 并没有实际使用。

我所要做的就是改变:

pc = new RTCPeerConnection(null);

收件人:

pc = new RTCPeerConnection(pcConfig);

现在一切正常。