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

Ped*_*olo 18 javascript html5 video-streaming html5-video webrtc

我一直在实施webrtc视频聊天.

除了对等关闭浏览器的情况外,一切都顺利进行.

我一直试图通过在远程媒体流上实现一个关于回调的回调来处理这个事件.但是,这个回调似乎从未被调用过.

如何检测对等方的浏览器已关闭或另一方已完成连接?

Mar*_*S95 22

您可以使用ICE连接状态来确定这一点.如果断开一个对等体,它需要几秒钟(~5?)才能识别它,但即使没有信号服务器它也可以工作.

(假设您调用了对等连接pc)

pc.oniceconnectionstatechange = function() {
    if(pc.iceConnectionState == 'disconnected') {
        console.log('Disconnected');
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,这确实是一个简单的拼写问题!谢谢玛丽恩。您能否编辑您的初始答案以将您的“onineconnectionstatechange”替换为“oniceconnectionstatechange”?我不允许编辑。 (2认同)

Mua*_*han 6

使用信令网关向您要离开的所有连接对等体发送消息; 像这样:

window.addEventListener('beforeunload', function () {
    userLeft();
}, false);

window.addEventListener('keyup', function (e) {
    if (e.keyCode == 116)
        userLeft();
}, false);

function userLeft() {
    signalingGateway.send({
        userLeft: true,
        whoLeft: 'user-id'
    });
}

signalingGateway.on('message', function (signal) {
    if (signal.userLeft && signal.whoLeft != 'current-user-id') {
        var relevantPeer = listOfPeers[signal.whoLeft];
        if (relevantPeer) {
            relevantPeer.close();
            relevantPeer = null;
        }

        var relevantLocalStreams = listOfLocalStreams[signal.whoLeft];
        if (relevantLocalStreams.length) {
            for (var i = 0; i < relevantLocalStreams.length; i++) {
                if (relevantLocalStreams[i].stop) {
                    relevantLocalStreams[i].stop();
                }

                // it is suggested to stop media tracks instead!
            }
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

  • `iceState=disconnected` 依赖于在会话的生命周期内不断发出的 STUN 绑定请求。这种方法在实时应用程序中不被认为是可靠的解决方案,这就是所有 WebRTC 服务提供商(TokBox、EasyRTC 等)处理在线状态/等的原因。信令端检测。手动检查服务器上的心跳或监听“断开连接”事件可以产生更好/可靠的体验。DataChannels 可以在实时会话中多次自动断开连接,这就是为什么 `channel.onclose` 不是一个好的处理程序。如果您尝试发送大于 64k 左右的更大消息,则通道可能会关闭。 (3认同)
  • 请记住,可以使用getStats API检测远程媒体流是否停止接收RTP数据包; 但是,您需要依赖预定义的变量/名称! (2认同)