检测 WebRTC 连接中的离线对等点

Posted

技术标签:

【中文标题】检测 WebRTC 连接中的离线对等点【英文标题】:Detect offline peer in WebRTC connection 【发布时间】:2016-02-23 12:31:03 【问题描述】:

我们正在使用 WebRTC 开发从移动设备到计算机的视频流。移动设备可能会完全失去连接,计算机应该能够检测到这一点。现在,视频只是冻结了。但是在这种情况下,EventHandlers of RTCPeerConnection 都不会被调用。

那么如何在其他对等点上检测到这样的连接失败呢? 对等点如何首先检测连接建立时的连接问题?

【问题讨论】:

【参考方案1】:

作为 Firefox 中的一种解决方法,您可以使用 getStats 来检测数据包是否停止进入:

var findStat = (m, type) => [...m.values()].find(s => s.type == type && !s.isRemote);

var hasConnected = new Promise(resolve => pc.oniceconnectionstatechange =
  e => pc.iceConnectionState == "connected" && resolve());

var hasDropped = hasConnected.then(() => new Promise(resolve => 
  var lastPackets = countdown = 0, timeout = 3; // seconds

  var iv = setInterval(() => pc.getStats().then(stats => 
    var packets = findStat(stats, "inbound-rtp").packetsReceived;
    countdown = (packets - lastPackets)? timeout : countdown - 1;
    if (!countdown) resolve(clearInterval(iv)); 
    lastPackets = packets;
  ), 1000);
));

这是一个演示:https://jsfiddle.net/4rzhe7n8/

【讨论】:

这是一个简洁的解决方案,但如果您不是绝对的 JS 破解者,几乎无法阅读 :-) 但感谢分享。 @waldgeist,你好函数式编程。 :) 我把它写成一个插件,你不能打败它的大小。只需执行hasDropped.then(() => log("call dropped)) 即可使用它。但我不会撒谎,我发现这比我经常在 SO 上看到的 javascript 页面更具可读性。 JavaScript 在 lisp 中的根源比 Java 更多,而 es6 让我们更接近它的根源。 你说得对,但我还是要习惯 :-) 为我自己回答了最后一个问题 :-) 如果您每 3 秒检查一次,超时实际上可能会延长 3 秒,因为检测数据包丢失至少需要 2 个周期. @MartinŽdila 我更新了代码以更紧密地匹配 jsfiddle。诚然,Firefox 现在会触发“断开连接”和“失败”,尽管使用统计信息仍然有效,并且可用于在所有浏览器中更早地检测问题。【参考方案2】:

iceconnectionstatechange 处理程序应该在 5-10 秒后不再从对等方接收数据后触发(在 Chrome 中;Firefox 目前正在处理该问题)。示例见https://webrtc.github.io/samples/src/content/peerconnection/states/。

【讨论】:

谢谢。你对 Firefox 的看法是对的。在 Chrome 中,大约 5 秒后,oniceconnectionstatechangecurrentTarget.iceConnectionState == 'disconnected' 调用,再过 5 秒,同一个处理程序被 currentTarget.iceConnectionState == 'failed' 调用。 从下面的@MartinŽdila 呼应 cmets,这现在也适用于 Firefox。

以上是关于检测 WebRTC 连接中的离线对等点的主要内容,如果未能解决你的问题,请参考以下文章

在 webrtc 视频聊天中检测到对等方的浏览器已关闭

简单对等 WebRTC 错误:Ice 连接失败

使用 WebRtc 和本地点对点连接构建视频流应用程序?

WebRTC 对等服务器连接

iOS 中的离线通知

WebRTC:对多个对等连接使用相同的 SDP?