RTCPeerConnection: icecandidate Ereignis
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2017.
Ein icecandidate
Ereignis wird an einen RTCPeerConnection
gesendet, wenn:
- Ein
RTCIceCandidate
identifiziert und dem lokalen Peer durch einen Aufruf vonRTCPeerConnection.setLocalDescription()
hinzugefügt wurde, - Jeder
RTCIceCandidate
, der mit einem bestimmten Benutzername-Fragment und Passwort-Kombination (eine Generation) korreliert ist, so identifiziert und hinzugefügt wurde, und - Alle ICE-Sammlungen auf allen Transporten abgeschlossen sind.
In den ersten beiden Fällen sollte der Ereignishandler den Kandidaten über den Signalisierungskanal an den Remote-Peer übertragen, damit der Remote-Peer ihn seiner Menge an Remote-Kandidaten hinzufügen kann.
Dieses Ereignis kann nicht abgebrochen werden und blubbert nicht.
Syntax
Verwenden Sie den Ereignisnamen in Methoden wie addEventListener()
oder setzen Sie eine Ereignishandler-Eigenschaft.
addEventListener("icecandidate", (event) => { })
onicecandidate = (event) => { }
Ereignistyp
Ein RTCPeerConnectionIceEvent
. Erbt von Event
.
Ereigniseigenschaften
Ein RTCPeerConnectionIceEvent
ist ein Event
, daher implementiert dieses Ereignis auch die folgende Eigenschaft.
RTCPeerConnectionIceEvent.candidate
Schreibgeschützt-
Gibt den
RTCIceCandidate
an, der den mit dem Ereignis assoziierten Kandidaten enthält. Dies wird der leere String sein, wenn das Ereignis anzeigt, dass keine weiteren Kandidaten in dieser Generation vorkommen, odernull
, wenn alle ICE-Sammlungen auf allen Transporten abgeschlossen sind.
Beschreibung
Es gibt drei Gründe, warum das icecandidate
Ereignis auf einem RTCPeerConnection
ausgelöst wird.
Teilen eines neuen Kandidaten
Die Mehrheit der icecandidate
Ereignisse wird ausgelöst, um anzuzeigen, dass ein neuer Kandidat gesammelt wurde. Dieser Kandidat muss über den Signalisierungskanal, den Ihr Code verwaltet, an den Remote-Peer übermittelt werden.
rtcPeerConnection.onicecandidate = (event) => {
if (event.candidate !== null) {
sendCandidateToRemotePeer(event.candidate);
} else {
/* there are no more candidates coming during this negotiation */
}
};
Der Remote-Peer wird, nachdem er den Kandidaten erhalten hat, den Kandidaten zu seinem Kandidatenpool hinzufügen, indem er addIceCandidate()
aufruft und den von Ihnen über den Signalisierungsserver übermittelten candidate
String übergibt.
Anzeige des Endes einer Generation von Kandidaten
Wenn eine ICE Aushandlungs-Session keine Kandidaten mehr für einen bestimmten RTCIceTransport
vorschlagen kann, ist die Sammlung für eine Generation von Kandidaten abgeschlossen. Dies wird durch ein icecandidate
Ereignis angezeigt, dessen candidate
String leer ist (""
).
Sie sollten dies an den Remote-Peer genauso wie einen normalen Kandidaten übermitteln, wie oben unter Teilen eines neuen Kandidaten beschrieben. Dies stellt sicher, dass der Remote-Peer auch die Benachrichtigung über das Ende der Kandidaten erhält. Wie Sie im letzten Abschnitt im Code sehen, wird jeder Kandidat an den anderen Peer gesendet, einschließlich solcher, die möglicherweise einen leeren Kandidaten-String haben. Nur Kandidaten, für die die candidate
Eigenschaft des Ereignisses null
ist, werden nicht über die Signalisierungsverbindung weitergeleitet.
Die Anzeige des Endes der Kandidaten ist in Abschnitt 9.3 des Trickel-ICE-Entwurfsspezifikations beschrieben (beachten Sie, dass sich die Abschnittsnummer ändern kann, da die Spezifikation fortlaufend überarbeitet wird).
Anzeige, dass die ICE-Sammlung abgeschlossen ist
Sobald alle ICE-Transporte das Sammeln von Kandidaten abgeschlossen haben und der Wert des RTCPeerConnection
Objekts iceGatheringState
auf complete
übergegangen ist, wird ein icecandidate
Ereignis mit dem Wert candidate
auf null
gesetzt.
Dieses Signal existiert für Zwecke der Rückwärtskompatibilität und muss nicht weiter an den Remote-Peer übermittelt werden (weshalb der obige Code-Schnipsel prüft, ob event.candidate
null
ist, bevor der Kandidat weitergeleitet wird).
Wenn Sie spezielle Aktionen ausführen müssen, wenn keine weiteren Kandidaten erwartet werden, ist es viel zuverlässiger, den Status der ICE-Sammlung zu beobachten, indem Sie auf icegatheringstatechange
Ereignisse achten:
pc.addEventListener("icegatheringstatechange", (ev) => {
switch (pc.iceGatheringState) {
case "new":
/* gathering is either just starting or has been reset */
break;
case "gathering":
/* gathering has begun or is ongoing */
break;
case "complete":
/* gathering has ended */
break;
}
});
Wie Sie in diesem Beispiel sehen, lässt Sie das icegatheringstatechange
Ereignis wissen, wann der Wert der RTCPeerConnection
Eigenschaft iceGatheringState
aktualisiert wurde. Wenn dieser Wert jetzt complete
ist, wissen Sie, dass die ICE-Sammlung gerade beendet wurde.
Dies ist ein zuverlässigerer Ansatz als das Prüfen der einzelnen ICE-Nachrichten, um zu erkennen, dass die ICE-Session beendet ist.
Beispiele
Dieses Beispiel erstellt einen einfachen Handler für das icecandidate
Ereignis, der eine Funktion namens sendMessage()
verwendet, um eine Antwort an den entfernten Peer über den Signalisierungsserver zu erstellen und zu senden.
Zuerst ein Beispiel unter Verwendung von addEventListener()
:
pc.addEventListener(
"icecandidate",
(ev) => {
if (ev.candidate !== null) {
sendMessage({
type: "new-ice-candidate",
candidate: ev.candidate,
});
}
},
false,
);
Sie können die onicecandidate
Ereignishandler-Eigenschaft auch direkt setzen:
pc.onicecandidate = (ev) => {
if (ev.candidate !== null) {
sendMessage({
type: "new-ice-candidate",
candidate: ev.candidate,
});
}
};
Spezifikationen
Specification |
---|
WebRTC: Real-Time Communication in Browsers # dom-rtcpeerconnection-onicecandidate |