RTCPeerConnection:setLocalDescription() 方法

Baseline 已廣泛支援

此功能已成熟,可跨多種裝置和瀏覽器版本使用。自 2017 年 9 月以來,它已在瀏覽器中提供。

RTCPeerConnection 介面的 setLocalDescription() 方法會更改與連線關聯的本地描述。此描述指定了連線本地端(包括媒體格式)的屬性。該方法接受一個引數——會話描述(session description),並返回一個 Promise,該 Promise 在描述更改後非同步完成。

如果在連線已建立的情況下呼叫 setLocalDescription(),則意味著正在進行重新協商(可能是為了適應不斷變化的連線條件)。由於描述將在兩個對等端就配置達成一致之前進行交換,因此透過呼叫 setLocalDescription() 提交的描述不會立即生效。相反,當前的連線配置將保持不變,直到協商完成。只有到那時,商定的配置才會生效。

語法

js
setLocalDescription()
setLocalDescription(sessionDescription)

setLocalDescription(sessionDescription, successCallback, errorCallback) // deprecated

引數

sessionDescription 可選

一個物件,用於指定要應用於連線本地端的配置。它應包含以下屬性:

type 可選

一個字串,指示會話描述的型別。如果您不明確提供會話描述,WebRTC 執行時將嘗試正確處理。如果信令狀態是 stablehave-local-offerhave-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() 版本時,可能會發生以下異常:

InvalidStateError DOMException 已棄用

如果連線的 signalingState"closed",則丟擲此異常,表示連線當前未開啟,因此無法進行協商。

InvalidSessionDescriptionError DOMException 已棄用

如果 sessionDescription 引數無效,則丟擲此異常。

示例

隱式描述

setLocalDescription() 無引數形式的一個優點是,它可以大大簡化您的協商程式碼。在大多數情況下,您的 negotiationneeded 事件處理程式只需要如下所示。只需新增信令伺服器程式碼,此處用 signalRemotePeer() 呼叫表示。

js
pc.addEventListener("negotiationneeded", async (event) => {
  await pc.setLocalDescription();
  signalRemotePeer({ description: pc.localDescription });
});

除錯誤處理外,就是這樣了!

提供您自己的 offer 或 answer

下面的示例演示了一個 negotiationneeded 事件的處理程式的實現,該處理程式顯式建立 offer,而不是讓 setLocalDescription() 來完成。

js
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

瀏覽器相容性

另見