2014-01-20 4 views
11

Ich habe ein webrtc videochat implementiert.Erkennen, dass der Browser des Peers in einem webrtc videochat geschlossen wurde

Alles funktioniert reibungslos, außer wenn der Peer den Browser schließt.

Ich habe versucht, dieses Ereignis zu behandeln, indem Sie einen aktivierten Rückruf auf dem Remote-Media-Stream implementieren. Dieser Callback scheint jedoch nie aufgerufen zu werden.

Wie kann ich erkennen, dass der Browser des Peers geschlossen wurde oder dass die Verbindung auf der anderen Seite beendet wurde?

Antwort

17

können Sie den ICE-Verbindungsstatus, dies zu bestimmen verwenden. Wenn Sie einen Peer trennen, dauert es einige Sekunden (~ 5?), Um ihn zu erkennen, aber er funktioniert auch ohne Signalisierungsserver.

(vorausgesetzt, Sie Ihre Peer-Verbindung genannt pc)

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

das funktioniert wunderbar. Vielen Dank. –

+0

Froh, dass es geholfen hat :) – MarijnS95

+0

Aus irgendeinem Grund scheint dieses Ereignis nicht in meiner Implementierung gefeuert zu werden (Chrome 40) –

4

Verwenden Sie das Signalisierungsgateway, um Nachrichten an alle verbundenen Peers zu senden, die Sie verlassen. wie folgt aus:

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

Denken Sie daran, es möglich ist, zu erkennen, ob Remote-Media-Stream empfangen gestoppt RTP-Pakete getStats API; Sie müssen sich jedoch auf vordefinierte Variablen/Namen verlassen! –

+0

Ich habe kein vollständiges Signalisierungs-Gateway für jetzt. –

+0

Hallo Muaz, ich mag wirklich deine WebRTC funktioniert! Ich bin neugierig, warum schlagen Sie vor, Signalisierungs-Gateway hier zu verwenden, ist es unmöglich, Nachricht direkt über DataChannel zu Peers onbeforeunload zu werfen? Und auch onbeforeunload wird fehlschlagen, wenn der Browser/pc des Benutzers abstürzt. Gibt es in diesem Szenario eine Problemumgehung? Eine Möglichkeit besteht darin, einen Herzschlag auf einer Websocket-Signalisierungsserver-Seite zu machen und auf diese Weise Diskonnektion zu erkennen, aber vielleicht können Sie etwas Besseres vorschlagen? –

0

Gerade Verwenden

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

Welcher Typ von Variable ist 'Verbindung' in Ihrem Beispiel? Ist es ein Datenkanal? Da der Datenkanal das Schließen auf dem Remote-Peer nicht erkennt –