在 WebRTC 连接中检测离线对等体
Detect offline peer in WebRTC connection
我们正在使用 WebRTC 开发从移动设备到计算机的视频流。移动设备可能会完全失去连接,计算机应该能够检测到。现在,视频刚刚冻结。但是在这种情况下 EventHandler
s of RTCPeerConnection
都没有被调用。
- 那么如何在另一个对等点上检测到这种连接失败?
- 对等点如何首先检测到连接建立时的连接问题?
iceconnectionstatechange 处理程序应该在 5-10 秒后不再从对等点接收数据(在 Chrome 中;Firefox 目前正在处理)。有关示例,请参阅 https://webrtc.github.io/samples/src/content/peerconnection/states/。
作为 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);
}));
我们正在使用 WebRTC 开发从移动设备到计算机的视频流。移动设备可能会完全失去连接,计算机应该能够检测到。现在,视频刚刚冻结。但是在这种情况下 EventHandler
s of RTCPeerConnection
都没有被调用。
- 那么如何在另一个对等点上检测到这种连接失败?
- 对等点如何首先检测到连接建立时的连接问题?
iceconnectionstatechange 处理程序应该在 5-10 秒后不再从对等点接收数据(在 Chrome 中;Firefox 目前正在处理)。有关示例,请参阅 https://webrtc.github.io/samples/src/content/peerconnection/states/。
作为 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);
}));