为 WebRTC 连接获取可用且活跃的 ICE 候选人

Get available and active ICE candidates for WebRTC connection

我在不同网络上的 2 个用户之间的 WebRTC 连接遇到了一个奇怪的问题。

用户 A 正在使用 phone 热点,用户 B 在我家的 WiFi 上。

当用户 A 是第一个加入该页面时,该用户向用户 B 发送了一个报价和一些 ICE 候选。用户 B 向用户 A 发送了一个答案和一些 ICE 候选,但是大约 20 秒后,ICE连接状态更改为“失败”(safari) 或“断开连接”(chrome)。用户 A 和用户 B 无法建立有效的 WebRTC 连接。

但是,当用户 B 第一个加入页面并创建报价,并且用户 A 发回一个答案时,两个用户都可以毫无问题地连接。

在这两种情况下,用户 A 和用户 B 都有正确的本地描述和远程描述,但在连接失败的第二种情况下,connectionStateICEConnectionState 是“两个用户都失败”(Safari)或“断开连接”(chrome)。

我在 RTCPeerConnection 的配置中同时使用了 TURN 和 STUN 服务器,并使用 Trickle ICE WebRTC example

测试了服务器是否正常工作

我怀疑用户 A 或用户 B 无法看到或使用其他用户的所有可用 ICE 候选项,但我不确定如何最好地解决该问题。有没有一种简单的方法可以查看给定 RTCPeerConnection 对象的哪些 ICE 候选人可用/活跃?

更新:

查看 chrome://webrtc-internals(作为 philipp-hancke sugested)表明

如果用户 B 发送报价: 4 个 ICE 候选对可用(2 host、1 srflx、1 relay) 使用用户 B 的外部 IP 和用户 A 的 TURN 服务器中继的 ICE 候选对被选中。连接有效。

如果用户 A 发送报价: 同样有 4 个 ICE 候选对可用(2 host、1 srflx、1 relay),但 ICE 候选对显示 (not connected) 并且没有建立 WebRTC 连接

更新二: 我已经接受了 Philipp Hancke 的回答,因为它回答了我最初提出的问题,即使我还没有解决我的问题。我问了一个新问题 here

这听起来像 long-standing bug in webrtc。使用 TURN 服务器通常可以解决这个问题,这也解释了为什么这不是任何人都应该优先处理的问题。

chrome://webrtc-internals 是调试此类问题的 one-shop-stop 位置。