Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检测到对等方';的浏览器在webrtc视频聊天中关闭_Javascript_Html_Video Streaming_Html5 Video_Webrtc - Fatal编程技术网

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

Javascript 检测到对等方';的浏览器在webrtc视频聊天中关闭,javascript,html,video-streaming,html5-video,webrtc,Javascript,Html,Video Streaming,Html5 Video,Webrtc,我一直在实现webrtc视频聊天 除了对方关闭浏览器的情况外,一切都很顺利 我一直试图通过在远程媒体流上实现一个统一回调来处理这个事件。不过,似乎从未调用过此回调 如何检测对方的浏览器已关闭或连接已在另一端完成?使用信令网关向您要离开的所有连接的对等方发送消息;像这样: window.addEventListener('beforeunload', function () { userLeft(); }, false); window.addEventListener('keyup',

我一直在实现webrtc视频聊天

除了对方关闭浏览器的情况外,一切都很顺利

我一直试图通过在远程媒体流上实现一个统一回调来处理这个事件。不过,似乎从未调用过此回调


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

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

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!
            }
        }
    }
});
window.addEventListener('beforeunload',函数(){
userLeft();
},假);
window.addEventListener('keyup',函数(e){
如果(e.keyCode==116)
userLeft();
},假);
函数userLeft(){
发送信号网关({
用户左:是的,
whoLeft:'用户id'
});
}
信号网关打开('message',函数(信号){
if(signal.userLeft&&signal.whoLeft!=“当前用户id”){
var relevantPeer=Piers列表[signal.whoLeft];
if(相关对等方){
relevantPeer.close();
relevantPeer=null;
}
var relevantLocalStreams=listOfLocalStreams[signal.whoLeft];
if(relevantLocalStreams.length){
对于(var i=0;i
您可以使用ICE连接状态来确定这一点。如果您断开一个对等节点的连接,则需要几秒钟(~5?)来重新编码,但即使没有信令服务器,它也可以工作

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

只用

 connection.onclose = function(event){
    event.useid // gives the connection closed userid
 }

我也有这个问题。我通过在所需的时刻关闭连接(例如在析构函数上)解决了这个问题

A B


关闭(A);//在此之后,B的ice状态几乎立即变为“kDisconnected”。

记住,可以使用getStats API检测远程媒体流是否停止接收RTP数据包;但是,您需要依赖预定义的变量/名称!我现在还没有一个完整的信令网关。你好,穆兹,我真的很喜欢你的webRTC作品!我很好奇,为什么你们建议在这里使用信令网关,在卸载之前直接通过数据通道将消息发送给对等方是不可能的吗?若用户的浏览器/电脑崩溃,onbeforeunload方式也会失败。在这种情况下有什么解决办法吗?一种方法是在websocket信令服务器端发出心跳信号,并通过这种方法检测断开连接,但也许您可以提出更好的建议?
iceState=disconnected
依赖于会话生存期内持续发出的STUN绑定请求。这种方法在实时应用中不被认为是一种可靠的解决方案,这就是为什么所有WebRTC服务提供商(TokBox、EasyRTC等)在信令端处理状态/等检测。手动检查服务器上的心跳或监听
断开连接
evens可以产生更好/可靠的体验。数据通道可以在实时会话中多次自动断开连接,这就是为什么
channel.onclose
不是一个好的处理程序。如果您尝试发送大于64k或更大的消息,则频道可能会关闭。出于某种原因,在我的实现(Chrome 40)@LouisLC中,此事件似乎没有被触发。我刚刚检查了它,对我来说,它在版本40.0.2214.115上运行良好。也许您应该检查
oniceconnectionstatechange
的拼写是否正确?a好的,连接应该首先设置为完成,然后才能启动,但我建议您在中查找,看看我是否遗漏了任何内容。是的,这确实是一个简单的拼写问题!谢谢你,玛丽。您是否可以编辑您的初始答案,将“onineconnectionstatechange”替换为“oniceconnectionstatechange”?“我是不允许编辑的。”路易斯洛现在我明白了,我自己写错了。很抱歉昨天甚至没有看到(虽然在我自己的代码版本中它是正确的)。在您的示例中,“连接”是什么类型的变量?它是数据通道吗?因为数据通道在远程对等机上未检测到关闭
 connection.onclose = function(event){
    event.useid // gives the connection closed userid
 }