createOffer()
方法在
RTCPeerConnection
interface initiates the creation of an
SDP
offer for the purpose of starting a new WebRTC connection to a remote peer.
The SDP offer includes information about any
MediaStreamTrack
s already attached to the WebRTC session, codec, and options supported by the browser, and any candidates already gathered by the
ICE
agent, for the purpose of being sent over the signaling channel to a potential peer to request a connection or to update the configuration of an existing connection.
返回值为
Promise
which, when the offer has been created, is resolved with a
RTCSessionDescription
object containing the newly-created offer.
aPromise = myPeerConnection.createOffer([options]);
myPeerConnection.createOffer(successCallback, failureCallback, [options])
选项
可选
RTCOfferOptions
dictionary providing options requested for the offer.
RTCOfferOptions
dictionary is used to customize the offer created by this method.
iceRestart
可选
true
. This will cause the returned offer to have different credentials than those already in place. If you then apply the returned offer, ICE will restart. Specify
false
to keep the same credentials and therefore not restart ICE.
默认为
false
.
offerToReceiveAudio
可选
(Legacy)
false
, the remote peer will not be offered to send audio data, even if the local side will be sending audio data. If this value is
true
, the remote peer will be offered to send audio data, even if the local side will
not
be sending audio data. The default behavior is to offer to receive audio only if the local side is sending audio, not otherwise.
false
, will set the direction of all existing audio transceivers to exclude reception (i.e. set to either
"sendonly"
or
"inactive"
).
true
, will ensure there is at least one transceiver set to receive audio that has not been stopped, and if there isn't one, one will be created.
RTCRtpTransceiver
to control whether or not to accept incoming audio.
offerToReceiveVideo
可选
(Legacy)
false
, the remote peer will not be offered to send video data, even if the local side will be sending video data. If this value is
true
, the remote peer will be offered to send video data, even if the local side will
not
be sending video data. The default behavior is to offer to receive video only if the local side is sending video, not otherwise.
false
, will set the direction of all existing video transceivers to exclude reception (i.e. set to either
"sendonly"
or
"inactive"
).
true
, will ensure there is at least one transceiver set to receive video that has not been stopped, and if there isn't one, one will be created.
RTCRtpTransceiver
to control whether or not to accept incoming video.
voiceActivityDetection
可选
true
(voice activity detection
enabled
).
In older code and documentation, you may see a callback-based version of this function. This has been deprecated and its use is
strongly
discouraged. You should update any existing code to use the
Promise
-based version of
createOffer()
instead. The parameters for this form of
createOffer()
are described below, to aid in updating existing code.
successCallback
RTCSessionDescriptionCallback
which will be passed a single
RTCSessionDescription
object describing the newly-created offer.
errorCallback
RTCPeerConnectionErrorCallback
which will be passed a single
DOMException
object explaining why the request to create an offer failed.
选项
可选
RTCOfferOptions
dictionary providing options requested for the offer.
A
Promise
whose fulfillment handler will receive an object conforming to the
RTCSessionDescriptionInit
dictionary which contains the SDP describing the generated offer. That received offer should be delivered through the signaling server to a remote peer.
These exceptions are returned by rejecting the returned promise. Your rejection handler should examine the received exception to determine which occurred.
InvalidStateError
RTCPeerConnection
is closed.
NotReadableError
createOffer()
was unable to create a new one. Since all WebRTC connections are required to be secured, that results in an error.
OperationError
Examining the state of the system to determine resource availability in order to generate the offer failed for some reason.
Here we see a handler for the
negotiationneeded
event which creates the offer and sends it to the remote system over a signaling channel.
注意:
Keep in mind that this is part of the signaling process, the transport layer for which is an implementation detail that's entirely up to you. In this case, a
WebSocket
connection is used to send a
JSON
message with a
type
field with the value "video-offer" to the other peer. The contents of the object being passed to the
sendToServer()
function, along with everything else in the promise fulfillment handler, depend entirely on your design.
myPeerConnection.createOffer().then(function(offer) {
return myPeerConnection.setLocalDescription(offer);
})
.then(function() {
sendToServer({
name: myUsername,
target: targetUsername,
type: "video-offer",
sdp: myPeerConnection.localDescription
});
})
.catch(function(reason) {
// An error occurred, so handle the failure to connect
});
In this code, the offer is created, and once successful, the local end of the
RTCPeerConnection
is configured to match by passing the offer (which is represented using an object conforming to
RTCSessionDescriptionInit
) into
setLocalDescription()
. Once that's done, the offer is sent to the remote system over the signaling channel; in this case, by using a custom function called
sendToServer()
. The implementation of the signaling server is independent from the WebRTC specification, so it doesn't matter how the offer is sent as long as both the caller and potential receiver are using the same one.
使用
Promise.catch()
to trap and handle errors.
见 Signaling and video calling for the complete example from which this snippet is derived; this will help you to understand how the signaling code here works.
| 规范 | 状态 | 注释 |
|---|---|---|
|
WebRTC 1.0: Real-time Communication Between Browsers
The definition of 'createOffer()' in that specification. |
候选推荐 | 初始定义。 |
| 桌面 | 移动 | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
createOffer
|
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
6.0
注意事项
|
完整支持
不支持
见实现注意事项。
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