RTCPeerConnection:setLocalDescription() 方法
RTCPeerConnection 介面的 setLocalDescription() 方法會更改與連線關聯的本地描述。此描述指定了連線本地端(包括媒體格式)的屬性。該方法接受一個引數——會話描述(session description),並返回一個 Promise,該 Promise 在描述更改後非同步完成。
如果在連線已建立的情況下呼叫 setLocalDescription(),則意味著正在進行重新協商(可能是為了適應不斷變化的連線條件)。由於描述將在兩個對等端就配置達成一致之前進行交換,因此透過呼叫 setLocalDescription() 提交的描述不會立即生效。相反,當前的連線配置將保持不變,直到協商完成。只有到那時,商定的配置才會生效。
語法
setLocalDescription()
setLocalDescription(sessionDescription)
setLocalDescription(sessionDescription, successCallback, errorCallback) // deprecated
引數
sessionDescription可選-
一個物件,用於指定要應用於連線本地端的配置。它應包含以下屬性:
type可選-
一個字串,指示會話描述的型別。如果您不明確提供會話描述,WebRTC 執行時將嘗試正確處理。如果信令狀態是
stable、have-local-offer或have-remote-pranswer之一,WebRTC 執行時會自動建立一個新的 offer 並將其設定為新的本地描述。否則,setLocalDescription()會建立一個 answer,並將其作為新的本地描述。 sdp可選-
一個包含會話 SDP 的字串。如果未提供 sdp,則預設為空字串。如果
type為"rollback",則sdp必須為 null 或空字串。
如果省略了描述,WebRTC 執行時會嘗試自動執行正確的操作。
您也可以傳入一個實際的
RTCSessionDescription例項,但沒有區別。因此,RTCSessionDescription建構函式已棄用。
在舊程式碼和文件中,您可能會看到此函式的基於回撥的版本。此版本已棄用,並且**強烈**不建議使用,因為它將來會被移除。您應該更新任何現有程式碼以使用 setLocalDescription() 的基於 Promise 的版本。為了幫助更新現有程式碼,下面將介紹 setLocalDescription() 舊形式的引數。
successCallback已棄用-
一個 JavaScript
Function,它不接受任何輸入引數,將在成功設定描述後被呼叫。屆時,可以透過信令伺服器將 offer 傳送到遠端對等端。 errorCallback已棄用-
一個函式,其簽名符合
RTCPeerConnectionErrorCallback,如果無法設定描述,則呼叫此函式。它會接收一個DOMException物件,解釋請求失敗的原因。
此方法的已棄用形式會立即返回,而不等待實際設定完成:如果成功,將呼叫 successCallback;如果失敗,將呼叫 errorCallback。
返回值
一個 Promise,在 RTCPeerConnection.localDescription 的值成功更改後兌現,或者在更改無法應用時(例如,如果指定的描述與連線中的一個或兩個對等端不相容)拒絕。Promise 的兌現處理程式不接收任何輸入引數。
注意: 更改描述的過程實際上涉及 WebRTC 層處理的中間步驟,以確保在更改不成功時不會丟失有源連線。有關此過程的更多詳細資訊,請參閱 WebRTC 連線頁面中的 掛起和當前描述。
已棄用的異常
在使用已棄用的基於回撥的 setLocalDescription() 版本時,可能會發生以下異常:
InvalidStateErrorDOMException已棄用-
如果連線的
signalingState為"closed",則丟擲此異常,表示連線當前未開啟,因此無法進行協商。 InvalidSessionDescriptionErrorDOMException已棄用-
如果
sessionDescription引數無效,則丟擲此異常。
示例
隱式描述
setLocalDescription() 無引數形式的一個優點是,它可以大大簡化您的協商程式碼。在大多數情況下,您的 negotiationneeded 事件處理程式只需要如下所示。只需新增信令伺服器程式碼,此處用 signalRemotePeer() 呼叫表示。
pc.addEventListener("negotiationneeded", async (event) => {
await pc.setLocalDescription();
signalRemotePeer({ description: pc.localDescription });
});
除錯誤處理外,就是這樣了!
提供您自己的 offer 或 answer
下面的示例演示了一個 negotiationneeded 事件的處理程式的實現,該處理程式顯式建立 offer,而不是讓 setLocalDescription() 來完成。
async function handleNegotiationNeededEvent() {
try {
const offer = await pc.createOffer();
pc.setLocalDescription(offer);
signalRemotePeer({ description: pc.localDescription });
} catch (err) {
window.reportError(err);
}
}
這首先透過呼叫 createOffer() 來建立 offer;成功後,我們呼叫 setLocalDescription()。然後,我們可以使用信令伺服器將新建立的 offer 傳送到另一方對等端,此處是透過呼叫一個名為 signalRemotePeer() 的函式來完成的。
規範
| 規範 |
|---|
| WebRTC:瀏覽器中的即時通訊 # dom-peerconnection-setlocaldescription |
瀏覽器相容性
載入中…