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

浏览器兼容性

另见