RTCPeerConnection: событие icecandidate
Базовая Широко поддерживается
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с января 2020 года.
Событие icecandidate отправляется в RTCPeerConnection, когда:
- Кандидат
RTCIceCandidateбыл идентифицирован и добавлен к локальному peer при вызовеRTCPeerConnection.setLocalDescription(), - Каждый
RTCIceCandidate, связанный с конкретным фрагментом имени пользователя и комбинацией паролей (поколение), был так идентифицирован и добавлен, и - Сбор ICE на всех каналах завершён.
В первых двух случаях обработчик событий должен передать кандидата удалённому peer по каналу сигнализации, чтобы удалённый peer смог добавить его в свой набор удалённых кандидатов.
Это событие не может быть отменено и не «пузырится».
Синтаксис
Используйте имя события в методах, таких как addEventListener(), или установите обработчик событий.
addEventListener("icecandidate", (event) => {});
onicecandidate = (event) => {};
Тип события
RTCPeerConnectionIceEvent. Наследуется от Event.
Свойства события
Так как RTCPeerConnectionIceEvent является Event, это событие также реализует следующие свойства.
-
RTCPeerConnectionIceEvent.candidateТолько для чтения -
Указывает
RTCIceCandidate, содержащий кандидата, связанного с событием. Будет пустой строкой, если событие указывает, что больше кандидатов в этом поколении нет, илиnullесли сбор ICE на всех каналах завершён.
Описание
Событие icecandidate на RTCPeerConnection срабатывает по трём причинам.
Передача нового кандидата
Большинство событий icecandidate срабатывают, чтобы указать, что новый кандидат был собран. Этот кандидат должен быть передан удалённому peer по каналу сигнализации, управляемому вашим кодом.
rtcPeerConnection.onicecandidate = (event) => {
if (event.candidate !== null) {
sendCandidateToRemotePeer(event.candidate);
} else {
/* there are no more candidates coming during this negotiation */
}
};
Удалённый peer, получив кандидата, добавит его в свой пул кандидатов, вызвав addIceCandidate() и передав строку candidate, переданную вами через сервер сигнализации.
Указание конца поколения кандидатов
Когда сессия ICE-переговоров исчерпывает кандидатов для данного RTCIceTransport, сбор для поколения кандидатов завершается. Об этом сигнализирует событие icecandidate с пустой строкой candidate ("").
Вы должны передать это удалённому peer так же, как и стандартного кандидата, как описано в разделе Передача нового кандидата выше. Это гарантирует, что удалённому peer также будет сообщено об окончании кандидатов. Как видно из кода в предыдущем разделе, каждый кандидат отправляется другому peer, включая тех, у кого может быть пустая строка кандидата. Только кандидаты, для которых свойство candidate события является null, не передаются по каналу сигнализации.
Об указании окончания кандидатов говорится в разделе 9.3 черновика спецификации Trickle ICE (обратите внимание, что номер раздела может измениться, пока спецификация проходит многократные этапы разработки).
Указание завершения сбора ICE
После того, как все каналы ICE завершат сбор кандидатов, и значение свойства RTCPeerConnection объекта iceGatheringState перейдёт в состояние complete, отправляется событие icecandidate со значением candidate равным null.
Этот сигнал существует для обеспечения обратной совместимости и не должен передаваться удалённому peer (поэтому фрагмент кода выше проверяет, является ли event.candidate равным null перед отправкой кандидата).
Если вам нужно выполнить какие-либо особые действия, когда больше кандидатов не ожидается, гораздо лучше следить за состоянием сбора ICE, отслеживая события icegatheringstatechange:
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;
}
});
Как видно из этого примера, событие icegatheringstatechange сообщает вам, когда значение свойства RTCPeerConnection iceGatheringState было обновлено. Если это значение теперь complete, вы знаете, что сбор ICE только что завершился.
Это более надёжный подход, чем поиск отдельных сообщений ICE, указывающих на окончание сессии ICE.
Примеры
В этом примере создаётся простой обработчик события icecandidate, который использует функцию sendMessage() для создания и отправки ответа удалённому peer через сервер сигнализации.
Сначала пример с использованием addEventListener():
pc.addEventListener(
"icecandidate",
(ev) => {
if (ev.candidate !== null) {
sendMessage({
type: "new-ice-candidate",
candidate: ev.candidate,
});
}
},
false,
);
Вы также можете установить обработчик события onicecandidate напрямую:
pc.onicecandidate = (ev) => {
if (ev.candidate !== null) {
sendMessage({
type: "new-ice-candidate",
candidate: ev.candidate,
});
}
};
Спецификации
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
icecandidate_event |
24 | 15 | 22 | 15 | 11 | 25 | 24 | 14 | 11 | 1.5 | 4.4 |
См. также
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/icecandidate_event