RTCPeerConnection: addIceCandidate() 方法
RTCPeerConnection 介面的 addIceCandidate() 方法會將一個新的遠端候選新增到連線的遠端描述中,該描述描述了連線遠端端的狀態。
當使用 RTCPeerConnection 的網站或應用程式透過其信令通道從遠端對等方接收到新的 ICE 候選時,它會透過呼叫 RTCPeerConnection.addIceCandidate() 將新收到的候選傳遞給瀏覽器的 ICE 代理。這會將此新的遠端候選新增到 RTCPeerConnection 的遠端描述中,該描述描述了連線遠端端的狀態。
如果在呼叫 addIceCandidate() 時 candidate 引數缺失或值為 null,則新增的 ICE 候選是一個“結束候選”指示符。如果指定物件的 candidate 屬性的值缺失或為空字串 (""),也表示所有遠端候選都已傳遞完畢。
透過具有 end-of-candidates a-line 值的候選來向遠端對等方傳輸結束候選通知。
在協商過程中,您的應用程式可能會收到許多候選,您將透過這種方式將它們傳遞給 ICE 代理,使其能夠構建潛在連線方法的列表。這在 WebRTC 連線 和 信令和視訊通話 文章中有更詳細的介紹。
語法
addIceCandidate(candidate)
addIceCandidate(candidate, successCallback) // deprecated
addIceCandidate(candidate, successCallback, failureCallback) // deprecated
引數
candidate可選-
一個
RTCIceCandidate物件,或一個具有以下屬性的物件candidate可選-
一個描述候選屬性的字串,直接取自 SDP 屬性
"candidate"。候選字串指定候選的網路連線資訊。如果candidate為空字串 (""),則表示已到達候選列表的末尾;此候選稱為“結束候選”標記。候選字串的語法在 RFC 5245, section 15.1 中進行了描述。對於如下 a-line (屬性行):
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= 4234997325component="rtp"(數字 1 被編碼為該字串;2 變為"rtcp")protocol="udp"優先順序= 2043278322ip="192.0.2.172"port= 44323type="host"
更多資訊可以在
RTCIceCandidate.candidate中找到。注意:為了向後相容 WebRTC 規範的舊版本,建構函式也接受此字串作為引數。
sdpMid可選-
一個包含與候選關聯的媒體流的識別符號標籤的字串,如果沒有關聯的媒體流則為
null。預設值為null。更多資訊可以在
RTCIceCandidate.sdpMid中找到。 sdpMLineIndex可選-
一個數字屬性,包含與候選關聯的 m-line 在媒體描述的 SDP 中的零基索引,如果沒有此類關聯則為
null。預設值為null。更多資訊可以在
RTCIceCandidate.sdpMLineIndex中找到。 usernameFragment可選-
一個包含使用者名稱片段(通常簡稱為“ufrag”或“ice-ufrag”)的字串。此片段與 ICE 密碼(“ice-pwd”)一起,唯一標識單個正在進行的 ICE 互動(包括與 STUN 伺服器的任何通訊)。
該字串由 WebRTC 在會話開始時生成。其長度最多可達 256 個字元,並且至少 24 位必須包含隨機資料。它沒有預設值,除非顯式設定,否則不存在。
更多資訊可以在
RTCIceCandidate.usernameFragment中找到。
如果
sdpMid和sdpMLineIndex都為null,則該方法將丟擲TypeError異常。物件的內容應由透過信令通道接收到的訊息構建,該訊息描述了一個已準備好傳遞給本地 ICE 代理的新收到的 ICE 候選。
如果未指定
candidate物件,或其值為null,則使用end-of-candidatesa-line 向遠端對等方傳送結束候選訊號,格式如下:a=end-of-candidates
已棄用的引數
在舊程式碼和文件中,您可能會看到該函式的基於回撥的版本。該版本已被棄用,並且**強烈**不建議使用。您應該更新任何現有程式碼以使用 addIceCandidate() 的基於 Promise 的版本。為了幫助更新現有程式碼,下面描述了舊版 addIceCandidate() 的引數。
successCallback已棄用-
當 ICE 候選成功新增時呼叫的函式。此函式不接收任何輸入引數,也不返回值。
failureCallback已棄用-
嘗試新增 ICE 候選失敗時呼叫的函式。接收一個
DOMException物件作為輸入,描述失敗原因。
返回值
當 ICE 代理成功將候選新增到遠端對等方的描述中時,此方法返回的 Promise 會被 fulfilled。Promise 不接收任何輸入引數。
異常
當嘗試新增 ICE 候選時發生錯誤,此方法返回的 Promise 會被 rejected,將以下錯誤之一作為指定 DOMException 物件中 name 屬性的值傳遞給 rejection handler。
TypeError-
如果指定的候選的
sdpMid和sdpMLineIndex都為null,則返回此錯誤。 InvalidStateErrorDOMException-
如果
RTCPeerConnection當前沒有已建立的遠端對等方(remoteDescription為null),則返回此錯誤。 OperationErrorDOMException-
在以下任一情況發生時返回:
- 為
sdpMid指定的值非null,且與remoteDescription中包含的任何媒體描述的媒體描述 ID 不匹配。 - 指定的
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 的事件會為您處理它,傳送相應的事件。
規範
| 規範 |
|---|
| WebRTC:瀏覽器中的即時通訊 # dom-peerconnection-addicecandidate |
瀏覽器相容性
載入中…