RTCPeerConnection: метод addIceCandidate()
Базовая Широко доступна
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с января 2020 года.
Метод addIceCandidate() интерфейса RTCPeerConnection добавляет новый удалённый кандидат в удалённое описание соединения, которое описывает состояние удалённого конца соединения.
Когда веб-сайт или приложение, использующее RTCPeerConnection, получает нового кандидата ICE от удалённого узла через канал сигнализации, оно передает полученного кандидата агенту ICE браузера, вызвав RTCPeerConnection.addIceCandidate(). Это добавляет этого нового удалённого кандидата в удалённое описание RTCPeerConnection, которое описывает состояние удалённого конца соединения.
Если параметр candidate отсутствует или при вызове addIceCandidate() задано значение null, добавляемый кандидат ICE является индикатором «конец кандидатов». То же самое происходит, если значение свойства candidate указанного объекта отсутствует или является пустой строкой (""), что сигнализирует о том, что все удалённые кандидаты были доставлены.
Уведомление об окончании кандидатов передаётся удалённому узлу с помощью кандидата со значением атрибута a-line end-of-candidates.
Во время переговоров ваше приложение, вероятно, получит множество кандидатов, которые вы передадите агенту ICE таким образом, чтобы он мог построить список потенциальных способов соединения. Подробное описание этого процесса можно найти в статьях Подключение WebRTC и Сигнализация и видеозвонки.
Синтаксис
addIceCandidate(candidate) addIceCandidate(candidate, successCallback) // deprecated addIceCandidate(candidate, successCallback, failureCallback) // deprecated
Параметры
candidateНеобязательно-
Объект
RTCIceCandidateили объект со следующими свойствами:candidateНеобязательно-
Строка, описывающая свойства кандидата, взятая непосредственно из атрибута SDP
"candidate". Строка кандидата указывает информацию о сетевом соединении для кандидата. Еслиcandidateпустая строка (""), достигнут конец списка кандидатов; такой кандидат известен как маркер «конец кандидатов».Синтаксис строки кандидата описан в RFC 5245, раздел 15.1. Для a-строки (строки атрибутов), которая выглядит так:
a=candidate:4234997325 1 udp 2043278322 192.0.2.172 44323 typ host
соответствующее значение строки
candidateбудет:"candidate:4234997325 1 udp 2043278322 192.0.2.172 44323 typ host"`
Броузер всегда отдаёт предпочтение кандидатам с наивысшим
priority, при прочих равных условиях. В приведенном выше примере приоритет равен2043278322. Все атрибуты разделены одним пробелом и расположены в определённом порядке. Полный список атрибутов для этого кандидата:-
foundation= 4234997325 -
component="rtp"(число 1 закодировано в этой строке; 2 становится"rtcp") -
protocol="udp" -
priority= 2043278322 -
ip="192.0.2.172" -
port= 44323 -
type="host"
Дополнительную информацию можно найти в
RTCIceCandidate.candidate.Примечание: Для обратной совместимости со старыми версиями спецификации WebRTC конструктор также принимает эту строку напрямую в качестве аргумента.
-
sdpMidНеобязательно-
Строка, содержащая идентификатор тега потока медиа, к которому относится кандидат, или
nullесли нет связанного потока медиа. Значение по умолчанию —null.Дополнительную информацию можно найти в
RTCIceCandidate.sdpMid. sdpMLineIndexНеобязательно-
Числовое свойство, содержащее индекс m-строки (с нуля) с которой связан кандидат, в SDP описания медиа, или
nullесли нет такой ассоциации. Значение по умолчанию —null.Дополнительную информацию можно найти в
RTCIceCandidate.sdpMLineIndex. usernameFragmentНеобязательно-
Строка, содержащая фрагмент имени пользователя (обычно сокращённо «ufrag» или «ice-ufrag»). Этот фрагмент вместе с паролем ICE («ice-pwd») уникально идентифицирует одно текущее взаимодействие ICE (включая любое взаимодействие с сервером STUN).
Строка генерируется WebRTC в начале сеанса. Она может содержать до 256 символов, и по крайней мере 24 бита должны содержать случайные данные. У неё нет значения по умолчанию и она не присутствует, если не задана явно.
Дополнительную информацию можно найти в
RTCIceCandidate.usernameFragment.
Метод бросит исключение
TypeError, если иsdpMidиsdpMLineIndexимеют значениеnull.Содержимое объекта должно быть построено из сообщения, полученного по каналу сигнализации, описывающего только что полученного кандидата ICE, готового к передаче локальному агенту ICE.
Если объект
candidateне указан или его значение равноnull, сигнал об окончании кандидатов отправляется удалённому узлу с помощью a-строкиend-of-candidatesв формате:a=end-of-candidates
Параметры, помеченные как устаревшие
В старом коде и документации вы можете увидеть версию этой функции с обратной связью по вызовам. Она устарела и её использование **настоятельно не рекомендуется**. Вы должны обновить любой существующий код, чтобы использовать версию addIceCandidate() на основе Promise вместо этого. Параметры для старой формы addIceCandidate() описаны ниже, чтобы помочь в обновлении существующего кода.
successCallbackУстарело-
Функция, которая вызывается, когда кандидат ICE был успешно добавлен. Эта функция не принимает входных параметров и не возвращает значение.
failureCallbackУстарело-
Функция, которая вызывается, если попытка добавить кандидата ICE завершилась ошибкой. Принимает в качестве входного параметра объект
DOMException, описывающий причину ошибки.
Возвращаемое значение
Объект Promise, который выполняется, когда кандидат был успешно добавлен в описание удалённого узла агентом ICE. Обещание не принимает никаких входных параметров.
Исключения
При возникновении ошибки при попытке добавить ICE-кандидата, Promise, возвращаемый этим методом, отклоняется, возвращая одну из нижеприведённых ошибок в качестве атрибута name в указанном объекте DOMException, переданном обработчику отклонения.
TypeError-
Возвращается, если у указанного кандидата атрибуты
sdpMidиsdpMLineIndexоба равныnull. -
InvalidStateErrorDOMException -
Возвращается, если у
RTCPeerConnectionв данный момент нет установленного удалённого пэра (remoteDescriptionравенnull). -
OperationErrorDOMException -
Возвращается в одном из следующих случаев:
- Значение, указанное для
sdpMid, не являетсяnullи не совпадает с идентификатором описания медиаданных ни одного из описаний медиаданных, включённых вremoteDescription. - Указанное значение
sdpMLineIndexбольше или равно количеству описаний медиаданных, включённых в удалённое описание. - Указанный
ufragне совпадает с полемufragв любом из рассматриваемых удалённых описаний. - Одно или несколько значений в строке
candidateявляются недопустимыми или не могут быть обработаны. - Попытка добавить кандидата по каким-либо причинам терпит неудачу.
- Значение, указанное для
Примеры
Этот фрагмент кода демонстрирует, как передавать ICE-кандидатов через произвольный канал сигнализации.
// This example assumes that the other peer is using a signaling channel as follows:
//
// pc.onicecandidate = (event) => {
// if (event.candidate) {
// signalingChannel.send(JSON.stringify({ice: event.candidate})); // "ice" is arbitrary
// } else {
// // All ICE candidates have been sent
// }
// }
signalingChannel.onmessage = (receivedString) => {
const message = JSON.parse(receivedString);
if (message.ice) {
// A typical value of ice here might look something like this:
//
// {candidate: "candidate:0 1 UDP 2122154243 192.0.2.43 53421 typ host", sdpMid: "0", …}
//
// Pass the whole thing to addIceCandidate:
pc.addIceCandidate(message.ice).catch((e) => {
console.log(`Failure during addIceCandidate(): ${e.name}`);
});
} else {
// handle other things you might be signaling, like sdp
}
};
Последний кандидат, переданный таким образом удалённым пэром, будет специальным кандидатом, обозначающим конец списка кандидатов. Для наглядности, конец списка кандидатов может быть указан вручную следующим образом:
pc.addIceCandidate({ candidate: "" });
Однако, в большинстве случаев вам не нужно будет явно искать это, так как события, управляющие RTCPeerConnection, будут обрабатывать это за вас, отправляя соответствующие события.
Спецификации
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
addIceCandidate |
24 | 15 | 22Начиная с Firefox 68, параметрcandidate является необязательным при вызове addIceCandidate(). Значение null для candidate указывает на то, что больше кандидатов отправляться не будут, а пустая строка candidate указывает на то, что больше кандидатов текущей генерации не будут отправляться. |
15 | 11 | 25 | 24Начиная с Firefox 68, параметрcandidate является необязательным при вызове addIceCandidate(). Значение null для candidate указывает на то, что больше кандидатов отправляться не будут, а пустая строка candidate указывает на то, что больше кандидатов текущей генерации не будут отправляться. |
14 | 11 | 1.5 | 4.4 |
returns_promise |
50 | 79 | 37 | 37 | 11 | 50 | 37 | 37 | 11 | 5.0 | 50 |
См. также
© 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/addIceCandidate