RTCPeerConnection.addIceCandidate() - Web APIs 编辑

When a web site or app using RTCPeerConnection receives a new ICE candidate from the remote peer over its signaling channel, it delivers the newly-received candidate to the browser's ICE agent by calling RTCPeerConnection.addIceCandidate(). This adds this new remote candidate to the RTCPeerConnection's remote description, which describes the state of the remote end of the connection.

If the candidate parameter is missing or a value of null is given when calling addIceCandidate(), the added ICE candidate is an "end-of-candidates" indicator. The same is the case if the value of the specified object's candidate is either missing or an empty string (""), it signals that all remote candidates have been delivered.

The end-of-candidates notification is transmitted to the remote peer using a candidate with an a-line value of end-of-candidates.

During negotiation, your app will likely receive many candidates which you'll deliver to the ICE agent in this way, allowing it to build up a list of potential connection methods. This is covered in more detail in the articles WebRTC connectivity and Signaling and video calling.

Syntax

aPromise = pc.addIceCandidate(candidate);

addIceCandidate(candidate, successCallback, failureCallback); 
    This deprecated API should no longer be used, but will probably still work.
    

Parameters

candidate Optional

An object conforming to the RTCIceCandidateInit dictionary, or an RTCIceCandidate object; the contents of the object should be constructed from a message received over the signaling channel, describing a newly received ICE candidate that's ready to be delivered to the local ICE agent.

If no candidate object is specified, or its value is null, an end-of-candidates signal is sent to the remote peer using the end-of-candidates a-line, formatted like this:

a=end-of-candidates

Deprecated parameters

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 addIceCandidate() instead. The parameters for this form of addIceCandidate() are described below, to aid in updating existing code.

successCallback This deprecated API should no longer be used, but will probably still work.
A function to be called when the ICE candidate has been successfully added. This function receives no input parameters and doesn't return a value.
failureCallback This deprecated API should no longer be used, but will probably still work.
A function to be called if attempting to add the ICE candidate fails. Receives as input a DOMException object describing why failure occurred.

Return value

A Promise which is fulfilled when the candidate has been successfully added to the remote peer's description by the ICE agent. The promise does not receive any input parameters.

Exceptions

When an error occurs while attempting to add the ICE candidate, the Promise returned by this method is rejected, returning one of the errors below as the name attribute in the specified DOMException object passed to the rejection handler.

TypeError
The specified candidate's sdpMid and sdpMLineIndex are both null.
InvalidStateError
The RTCPeerConnection currently has no remote peer established (remoteDescription is null).
OperationError
This can happen for a number of reasons:
  • The value specified for sdpMid is non-null and doesn't match the media description ID of any media description included within the remoteDescription.
  • The specified value of sdpMLineIndex is greater than or equal to the number of media descriptions included in the remote description.
  • The specified ufrag doesn't match the ufrag field in any of the remote descriptions being considered.
  • One or more of the values in the candidate string are invalid or could not be parsed.
  • Attempting to add the candidate fails for any reason. 

Examples

This code snippet shows how to signal ICE candidates across an arbitrary signaling channel.

// 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.168.1.9 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
  }
}

The last candidate to be signaled this way by the remote peer will be a special candidate denoting end-of-candidates. Out of interest, end-of-candidates may be manually indicated as follows:

pc.addIceCandidate({candidate:''});

However, in most cases you won't need to look for this explicitly, since the events driving the RTCPeerConnection will deal with it for you, sending the appropriate events.

Specifications

SpecificationStatusComment
WebRTC 1.0: Real-time Communication Between Browsers
The definition of 'RTCPeerConnection.addIceCandidate()' in that specification.
Candidate RecommendationInitial specification.

Browser compatibility

BCD tables only load in the browser

See also

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

词条统计

浏览:112 次

字数:12425

最后编辑:7年前

编辑次数:0 次

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文