RTCPeerConnection: метод setRemoteDescription()
Базовая Широко доступна
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна в браузерах с января 2020 года.
Метод setRemoteDescription() интерфейса RTCPeerConnection устанавливает указанное описание сессии в качестве текущего предложения или ответа удалённого участника. Описание определяет свойства удалённого конца соединения, включая формат медиа. Метод принимает единственный параметр — описание сессии — и возвращает Promise, который выполняется после асинхронного изменения описания.
Обычно этот метод вызывается после получения предложения или ответа от другого участника через сервер сигнализации. Имейте в виду, что если setRemoteDescription() вызывается, когда соединение уже установлено, это означает, что идёт переподключение (возможно, для адаптации к меняющимся условиям сети).
Поскольку описания обмениваются до тех пор, пока два участника не согласятся на конфигурацию, описание, переданное при вызове setRemoteDescription(), не вступает в силу сразу. Вместо этого текущая конфигурация соединения остаётся неизменной до завершения переговоров. Только тогда согласованная конфигурация вступает в силу.
Синтаксис
setRemoteDescription(sessionDescription) // deprecated setRemoteDescription(sessionDescription, successCallback, errorCallback)
Параметры
sessionDescription-
Объект, определяющий текущее предложение или ответ удалённого участника. Он должен содержать следующие свойства:
type-
Строка, указывающая тип описания сессии. См.
RTCSessionDescription.type. sdpНеобязательно-
Строка, содержащая SDP, описывающая сессию. Если sdp не указан, он по умолчанию пустой. Если
typeявляется"rollback",sdpдолжно быть null или пустой строкой. См.RTCSessionDescription.sdp.
Вы также можете передать экземпляр
RTCSessionDescription, но разницы нет. По этой причине конструкторRTCSessionDescriptionустарел.
В более старом коде и документации вы можете видеть версию этого метода с обратными вызовами. Она устарела и её использование крайне не рекомендуется. Вы должны обновить любой существующий код, чтобы использовать версию на основе Promise вместо setRemoteDescription(). Параметры более старой формы setRemoteDescription() описаны ниже, чтобы помочь при обновлении существующего кода.
successCallbackУстарел-
JavaScript
Function, который не принимает входных параметров, вызывается, когда описание успешно установлено. В этот момент предложение может быть отправлено удалённому участнику через сервер сигнализации. errorCallbackУстарел-
Функция с сигнатурой
RTCPeerConnectionErrorCallback, которая вызывается, если описание не может быть установлено. Ей передаётся единственный объектDOMException, объясняющий причину неудачи.
Эта устаревшая форма метода возвращает значение мгновенно, не дожидаясь фактического выполнения операции: в случае успеха вызывается successCallback; в случае неудачи — errorCallback.
Возвращаемое значение
A Promise, который выполняется, когда значение remoteDescription соединения успешно изменено или отклоняется, если изменение не может быть применено (например, если указанное описание несовместимо с одним или обоими участниками соединения). Обработчик выполнения обещания не принимает входных параметров.
Примечание: Процесс изменения описаний на самом деле включает промежуточные шаги, обрабатываемые слоем WebRTC, чтобы гарантировать, что активное соединение можно изменить без потери соединения, если изменение не удаётся. Подробнее об этом процессе см. страницу «Соединение WebRTC: ожидаемые и текущие описания» в разделе «Соединения WebRTC».
Исключения
Следующие исключения сообщаются обработчику отклонения обещания, возвращаемого setRemoteDescription():
-
InvalidAccessErrorDOMException -
Возвращается, если содержимое описания некорректно.
-
InvalidStateErrorDOMException -
Возвращается, если
RTCPeerConnectionзакрыто или находится в состоянии, несовместимом с типомtypeуказанного описания. Например, это исключение выбрасывается, еслиtypeявляетсяrollback, а состояние сигнализации —stable,have-local-pranswerилиhave-remote-pranswer, потому что вы не можете откатить соединение, которое либо полностью установлено, либо находится на заключительной стадии подключения. -
OperationErrorDOMException -
Возвращается, если ошибка не соответствует указанным здесь. Это включает ошибки проверки подлинности.
-
RTCErrorDOMException -
Возвращается с установленным
errorDetailвsdp-syntax-error, если SDP, указанный вRTCSessionDescription.sdp, недействителен. СвойствоsdpLineNumberобъекта ошибки указывает номер строки в SDP, где была обнаружена синтаксическая ошибка. TypeError-
Возвращается, если
sessionDescriptionотсутствует свойствоtypeили вообще не был передан ни один параметр описания.
При использовании устаревшей версии метода setRemoteDescription() с обратными вызовами могут возникнуть следующие исключения:
InvalidStateErrorУстарел-
Состояние сигнализации
signalingStateсоединения равно"closed", что указывает на то, что соединение в настоящее время не открыто, поэтому переговоры не могут быть проведены. InvalidSessionDescriptionErrorУстарел-
Параметр
sessionDescriptionнекорректен.
Примечания по использованию
При вызове setRemoteDescription(), агент ICE проверяет, находится ли RTCPeerConnection в состоянии stable или have-remote-offer signalingState. Эти состояния означают, что либо существующее соединение переподключается, либо предложение, ранее указанное в предыдущем вызове setRemoteDescription(), заменяется новым предложением. В обоих этих случаях мы находимся в начале процесса переговоров, и предложение устанавливается как удалённое описание.
С другой стороны, если мы находимся в середине текущих переговоров и в setRemoteDescription() передаётся предложение, агент ICE автоматически начинает откат ICE, чтобы вернуть соединение в стабильное состояние сигнализации, а затем, после завершения отката, устанавливает удалённое описание в указанное предложение. Это запускает новую сессию переговоров, с новым предложением в качестве отправной точки.
После начала новых переговоров с установленным предложением локальный участник теперь является получателем, даже если он ранее был инициатором. Это происходит вместо выдачи исключения, тем самым уменьшая количество возможных ошибок и упрощая обработку, которую вам нужно выполнить при получении предложения, исключив необходимость обрабатывать процесс предложения/ответа по-разному в зависимости от того, является ли локальный участник инициатором или получателем.
Примечание: Ранние реализации WebRTC выдавали исключение, если предложение устанавливалось вне состояния stable или have-remote-offer.
Примеры
Здесь мы видим функцию, которая обрабатывает полученное от удаленного участника предложение. Этот код взят из примера и руководства статьи Сигнализация и видеозвонки; обратитесь к ней для получения более подробной информации и более глубокого объяснения происходящего.
function handleOffer(msg) {
createMyPeerConnection();
myPeerConnection
.setRemoteDescription(msg.description)
.then(() => navigator.mediaDevices.getUserMedia(mediaConstraints))
.then((stream) => {
document.getElementById("local_video").srcObject = stream;
return myPeerConnection.addStream(stream);
})
.then(() => myPeerConnection.createAnswer())
.then((answer) => myPeerConnection.setLocalDescription(answer))
.then(() => {
// Send the answer to the remote peer using the signaling server
})
.catch(handleGetUserMediaError);
}
После создания нашего RTCPeerConnection и сохранения его как myPeerConnection, мы передаём описание, содержащееся в полученном сообщении с предложением, msg, непосредственно в setRemoteDescription() для того, чтобы сообщить веб-слою WebRTC пользователя о предложенной настройке вызывающей стороны. Когда вызывается обработчик выполнения обещания, указывающий на то, что это сделано, мы создаём поток, добавляем его к соединению, затем создаём ответ SDP и вызываем setLocalDescription() для установки этой конфигурации с нашей стороны вызова перед передачей этого ответа вызывающей стороне.
Спецификации
| Спецификация |
|---|
| WebRTC: Взаимодействие в реальном времени в браузерах # dom-peerconnection-setremotedescription |
Совместимость с браузерами
| Рабочие столы | Мобильные устройства | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari на iOS | Samsung Internet | WebView Android | |
setRemoteDescription |
24 | 15 | 22 | 15 | 11 | 25 | 24 | 14 | 11 | 1.5 | 4.4 |
implicit_rollback |
80 | 80 | 70 | 67 | 15.4 | 80 | 79 | 66 | 15.4 | 13.0 | 80 |
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/setRemoteDescription