2

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

该网站是此 codelab 的第 5 步示例的略微修改版本,对 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 中遗漏了一些明显的东西,但我不知道是什么,所以我希望有人有一些想法并可以提供帮助!

4

1 回答 1

2

所以......原来这是一个愚蠢的问题。

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

我所要做的就是改变:

pc = new RTCPeerConnection(null);

到:

pc = new RTCPeerConnection(pcConfig);

现在一切正常。

于 2020-05-16T12:57:18.507 回答