RTCPeerConnection
方法
setRemoteDescription()
sets the specified session description as the remote peer's current offer or answer. The description specifies the properties of the remote end of the connection, including the media format.
The method takes a single parameter—the session description—and it returns a
Promise
which is fulfilled once the description has been changed, asynchronously.
This is typically called after receiving an offer or answer from another peer over the signaling server. Keep in mind that if
setRemoteDescription()
is called while a connection is already in place, it means renegotiation is underway (possibly to adapt to changing network conditions).
Because descriptions will be exchanged until the two peers agree on a configuration, the description submitted by calling
setRemoteDescription()
does not immediately take effect. Instead, the current connection configuration remains in place until negotiation is complete. Only then does the agreed-upon configuration take effect.
aPromise = rtcPeerConnection.setRemoteDescription(sessionDescription);
sessionDescription
RTCSessionDescriptionInit
or
RTCSessionDescription
which specifies the remote peer's current offer or answer. This value is an offer or answer received from the remote peer through your implementation of
sessionDescription
parameter is technically of type
RTCSessionDescriptionInit
, but because
RTCSessionDescription
serializes to be indistinguishable from
RTCSessionDescriptionInit
, you can also pass in an
RTCSessionDescription
. This lets you simplify code such as the following:
myPeerConnection.setRemoteDescription(new RTCSessionDescription(description))
.then(function () {
return createMyStream();
})
to simply be:
myPeerConnection.setRemoteDescription(description)
.then(function () {
return createMyStream();
})
使用
async
/
await
syntax, you can further simplify this to:
await myPeerConnection.setRemoteDescription(description); createMyStream();
Since it's unnecessary, the
RTCSessionDescription()
constructor is deprecated.
A
Promise
which is fulfilled once the value of the connection's
remoteDescription
is successfully changed or rejected if the change cannot be applied (for example, if the specified description is incompatible with one or both of the peers on the connection). The promise fulfillment handler receives no input parameters.
注意: The process of changing descriptions actually involves intermediary steps handled by the WebRTC layer to ensure that an active connection can be changed without losing the connection if the change does not succeed. See Pending and current descriptions in WebRTC connectivity for more details on this process.
The following exceptions are reported to the rejection handler for the promise returned by
setRemoteDescription()
:
InvalidAccessError
The content of the description is invalid.
InvalidStateError
RTCPeerConnection
is closed, or it's in a state which isn't compatible with the specified description's
type
。例如,若
type
is
rollback
and the signaling state is one of
stable
,
have-local-pranswer
,或
have-remote-pranswer
, this exception is thrown, because you can't roll back a connection that's either fully established or is in the final stage of becoming connected.
OperationError
OperationError
. This includes identity validation errors.
RTCError
RTCError
采用
errorDetail
设为
sdp-syntax-error
is reported if the
SDP
指定通过
RTCSessionDescription.sdp
. The error object's
sdpLineNumber
property indicates the line number within the SDP on which the syntax error was detected.
TypeError
RTCSessionDescriptionInit
or
RTCSessionDescription
object is missing the
type
property, or no description parameter was provided at all.
当调用
setRemoteDescription()
, the ICE agent checks to make sure the
RTCPeerConnection
is in either the
stable
or
have-remote-offer
signalingState
. These states indicate that either an existing connection is being renegotiated or that an offer previously specified by an earlier call to
setRemoteDescription()
is to be replaced with the new offer. In either of those two cases, we're at the beginning of the negotiation process, and the offer is set as the remote description.
On the other hand, if we're in the middle of an ongoing negotiation and an offer is passed into
setRemoteDescription()
, the ICE agent automatically begins an ICE rollback in order to return the connection to a stable signaling state, then, once the rollback is completed, sets the remote description to the specified offer. This begins a new negotiation session, with the newly-established offer as the starting point.
Upon starting the new negotiation with the newly-established offer, the local peer is now the callee, even if it was previously the caller. This happens instead of throwing an exception, thereby reducing the number of potential errors which might occur, and simplifies the processing you need to do when you receive an offer, by eliminating the need to handle the offer/answer process differently depending on whether the local peer is the caller or callee.
注意:
Earlier implementations of WebRTC would throw an exception if an offer was set outside a
stable
or
have-remote-offer
状态。
In older code and documentation, you may see a callback-based version of this function used. This has been deprecated and its use is
strongly
discouraged. You should update any existing code to use the
Promise
-based version of
setRemoteDescription()
instead. The parameters for the older form of
setRemoteDescription()
are described below, to aid in updating existing code.
pc.setRemoteDescription(sessionDescription, successCallback, errorCallback);
successCallback
函数
which accepts no input parameters to be be called once the description has been successfully set. At that time, the offer can be sent to a remote peer via the signaling server.
errorCallback
RTCPeerConnectionErrorCallback
which gets called if the description can't be set. It is passed a single
DOMException
object explaining why the request failed.
This deprecated form of the method returns instantaneously without waiting for the actual setting to be done: in case of success, the
successCallback
will be called; in case of failure, the
errorCallback
将被调用。
When using the deprecated callback-based version of
setRemoteDescription()
, the following exceptions may occur:
InvalidStateError
signalingState
is
"closed"
, indicating that the connection is not currently open, so negotiation cannot take place.
InvalidSessionDescriptionError
RTCSessionDescription
指定通过
sessionDescription
parameter is invalid.
Here we see a function which handles an offer received from the remote peer. This code is derived from the example and tutorial in the article Signaling and video calling ; take a look at that for more details and a more in-depth explanation of what's going on.
function handleOffer(msg) {
createMyPeerConnection();
myPeerConnection.setRemoteDescription(msg.description).then(function () {
return navigator.mediaDevices.getUserMedia(mediaConstraints);
})
.then(function(stream) {
document.getElementById("local_video").srcObject = stream;
return myPeerConnection.addStream(stream);
})
.then(function() {
return myPeerConnection.createAnswer();
})
.then(function(answer) {
return myPeerConnection.setLocalDescription(answer);
})
.then(function() {
// Send the answer to the remote peer using the signaling server
})
.catch(handleGetUserMediaError);
}
After creating our
RTCPeerConnection
and saving it as
myPeerConnection
, we pass the description included in the received offer message,
msg
, directly into
setRemoteDescription()
to tell the user agent's WebRTC layer what configuration the caller has proposed using. When our promise fulfillment handler is called, indicating that this has been done, we create a stream, add it to the connection, then create an SDP answer and call
setLocalDescription()
to set that as the configuration at our end of the call before forwarding that answer to the caller.
| 规范 | 状态 | 注释 |
|---|---|---|
|
WebRTC 1.0: Real-time Communication Between Browsers
The definition of 'RTCPeerConnection.setRemoteDescription()' in that specification. |
候选推荐 | 最初的规范。 |
| 桌面 | 移动 | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
setRemoteDescription()
|
Chrome
51
|
Edge 15 | Firefox 22 | IE No |
Opera
43
|
Safari 11 |
WebView Android
51
|
Chrome Android
51
|
Firefox Android 44 |
Opera Android
43
|
Safari iOS Yes |
Samsung Internet Android
5.0
|
| Implicit rollback | Chrome 80 | Edge 80 | Firefox 70 | IE No | Opera No | Safari No | WebView Android 80 | Chrome Android 80 | Firefox Android No | Opera Android No | Safari iOS No | Samsung Internet Android No |
| Description is optional | Chrome 80 | Edge 80 | Firefox 75 | IE No | Opera No | Safari No | WebView Android 80 | Chrome Android 80 | Firefox Android No | Opera Android No | Safari iOS No | Samsung Internet Android No |
完整支持
不支持
见实现注意事项。
RTCPeerConnection.remoteDescription
,
RTCPeerConnection.pendingRemoteDescription
,
RTCPeerConnection.currentRemoteDescription
RTCPeerConnection
canTrickleIceCandidates
connectionState
currentLocalDescription
currentRemoteDescription
getDefaultIceServers()
iceConnectionState
iceGatheringState
localDescription
onaddstream
onconnectionstatechange
ondatachannel
onicecandidate
oniceconnectionstatechange
onicegatheringstatechange
onidentityresult
onidpassertionerror
onidpvalidationerror
onnegotiationneeded
onpeeridentity
onremovestream
onsignalingstatechange
ontrack
peerIdentity
pendingLocalDescription
pendingRemoteDescription
remoteDescription
sctp
signalingState
addIceCandidate()
addStream()
addTrack()
close()
createAnswer()
createDataChannel()
createOffer()
generateCertificate()
getConfiguration()
getIdentityAssertion()
getReceivers()
getSenders()
getStats()
getStreamById()
getTransceivers()
removeStream()
removeTrack()
restartIce()
setConfiguration()
setIdentityProvider()
setLocalDescription()
setRemoteDescription()
MediaDevices.getUserMedia()
Navigator.mediaDevices
RTCCertificate
RTCDTMFSender
RTCDTMFToneChangeEvent
RTCDataChannel
RTCDataChannelEvent
RTCDtlsTransport
RTCErrorEvent
RTCIceCandidate
RTCIceTransport
RTCPeerConnectionIceErrorEvent
RTCPeerConnectionIceEvent
RTCRtpReceiver
RTCRtpSender
RTCRtpTransceiver
RTCSctpTransport
RTCSessionDescription
RTCStatsEvent
RTCStatsReport
RTCTrackEvent