Javascript 检测WebRTC连接中的脱机对等方

Javascript 检测WebRTC连接中的脱机对等方,javascript,webrtc,Javascript,Webrtc,我们正在使用WebRTC开发从移动设备到计算机的视频流。移动设备可能会完全失去连接,计算机应该能够检测到。现在,视频冻结了。但在这种情况下,这两种方法都不适用 那么,如何在另一个对等机上检测到这种连接故障呢 对等方如何首先检测连接建立时的连接问题 iceconnectionstatechange处理程序应该在不再从对等方接收数据的5-10秒后启动(在Chrome中;Firefox目前正在处理该问题)。请参阅示例。作为Firefox中的一种解决方法,您可以使用getStats检测数据包是否停止传

我们正在使用WebRTC开发从移动设备到计算机的视频流。移动设备可能会完全失去连接,计算机应该能够检测到。现在,视频冻结了。但在这种情况下,这两种方法都不适用

  • 那么,如何在另一个对等机上检测到这种连接故障呢
  • 对等方如何首先检测连接建立时的连接问题

iceconnectionstatechange处理程序应该在不再从对等方接收数据的5-10秒后启动(在Chrome中;Firefox目前正在处理该问题)。请参阅示例。

作为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);
}));

这里有一个演示:

谢谢。关于Firefox,你是对的。在Chrome中,大约5秒钟后,用
currentTarget.iceConnectionState='disconnected'
调用
OniconnectionStateChange
,5秒钟后用
currentTarget.iceConnectionState='failed'
调用同一个处理程序,这在Firefox中也适用。这是一个简洁的解决方案,但如果你不是一个绝对的JS破解高手,几乎无法阅读:-),但谢谢你分享它。@waldgeist,你好,函数编程。:)我写这封信是为了投机取巧,你再大也比不上了。只需执行hasdroped。然后(()=>log(“掉话”)使用它。但我不会撒谎,我发现这比我经常在上面看到的一页页又一页的JavaScript更具可读性。JavaScript在lisp中的根比Java多,es6让我们更接近它的根。你是对的,但我仍然必须习惯:-)为自己回答了最后一个问题:-)如果你每3秒钟检查一次,就会发生这种情况超时有效地延长了3秒,因为检测数据包丢失至少需要2个周期。@MartinŽdila我已经更新了代码,使之与JSFIDLE更加匹配。没错,Firefox现在触发“断开连接”和“失败”,尽管使用stats仍然有效,并且可以用于早期在所有浏览器中检测问题。