2014-01-20 1 views
11

私はwebrtcビデオチャットを実装しています。webrtcビデオチャットでピアのブラウザが閉じられたことを検出しました

ピアがブラウザを閉じる場合を除いてすべてがスムーズに動作しています。

私はこのイベントをリモートメディアストリームでonendコールバックを実装することで処理しようとしています。しかし、このコールバックは呼び出されることはないようです。

ピアのブラウザが閉じられているか、接続が相手側で終了したことを検出するにはどうすればよいですか?

答えて

17

これを判断するには、ICE接続ステータスを使用できます。 1つのピアを切断すると、それを再現するのに数秒(〜5秒)かかりますが、シグナリングサーバがなくても機能します。

(あなたがあなたのピア接続pcと呼ばれると仮定した場合)

pc.oniceconnectionstatechange = function() { 
    if(pc.iceConnectionState == 'disconnected') { 
     console.log('Disconnected'); 
    } 
} 
+0

これは素晴らしく機能します。ありがとう。 –

+0

喜んで – MarijnS95

+0

何らかの理由でこのイベントが私の実装(Chrome 40) –

4

シグナルゲートウェイを使用して、接続中のすべてのピアにメッセージを送信します。

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! 
      } 
     } 
    } 
}); 
+2

リモートメディアストリームがgetstatsをAPIを使用してRTPパケットを受信停止するかどうかを検出することが可能であることを覚えておいてください。ただし、あらかじめ定義された変数/名前に依存する必要があります。 –

+0

私は現在完全なシグナリングゲートウェイを持っていません。 –

+0

こんにちはMuaz、私は本当にあなたのwebRTCが好きです!なぜ私はあなたがここでシグナリングゲートウェイを使用することを提案しているのだろうか、興味があります。それは、DataChannelを介して直接メッセージを送信することは不可能ですか?また、ユーザーのブラウザ/ PCがクラッシュすると、onbeforeunloadの方法が失敗します。このシナリオでは回避策はありますか? 1つの方法は、WebSocketのシグナリングサーバ側でハートビートを作成し、このような方法で拒否を検出することができますが、何か良いことを示唆することができますか? –

0

使お

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

あなたの例では、どのタイプの変数が「接続」ですか?それはデータチャンネルですか?データチャネルはリモートピア上でクローズを検出しないため –

関連する問題