RTCPeerConnection:negotiationneeded 事件

Baseline 已广泛支持

此功能已成熟,可跨多种设备和浏览器版本使用。自 2017 年 9 月以来,它已在浏览器中提供。

当需要通过信令通道进行连接协商时,会向 RTCPeerConnection 发送一个 negotiationneeded 事件。这会在连接的初始设置期间发生,也会在任何时候通信环境发生变化需要重新配置连接时发生。

当媒体首次添加到连接时,会向 RTCPeerConnection 触发 negotiationneeded 事件。这会通过指示您的代码开始通过信令服务器交换 ICE 候选对象来启动 ICE 协商过程。请参阅 信令事务流程 以了解以 negotiationneeded 事件开始的信令过程的描述。

此事件不可取消,也不会冒泡。

语法

在诸如 addEventListener() 之类的方法中使用事件名称,或设置事件处理程序属性。

js
addEventListener("negotiationneeded", (event) => { })

onnegotiationneeded = (event) => { }

事件类型

一个通用的 Event

示例

在此示例中,我们使用 addEventListener()negotiationneeded 创建一个事件处理程序。它的作用是创建一个 SDP Offer 并通过信令通道将其发送给远程对等方。

js
pc.addEventListener("negotiationneeded", (ev) => {
  pc.createOffer()
    .then((offer) => pc.setLocalDescription(offer))
    .then(() =>
      sendSignalingMessage({
        type: "video-offer",
        sdp: pc.localDescription,
      }),
    )
    .catch((err) => {
      // handle error
    });
});

创建 Offer 后,通过调用 RTCPeerConnection.setLocalDescription() 配置本地端;然后创建一个信令消息并通过信令服务器发送给远程对等方,以与另一个对等方共享该 Offer。另一个对等方应该识别此消息,并通过创建自己的 RTCPeerConnection,使用 setRemoteDescription() 设置远程描述,然后创建 Answer 发送回 Offer 对等方来跟进。

您也可以通过将事件处理函数分配给 onnegotiationneeded 属性来为 negotiationneeded 事件设置事件处理程序。

js
pc.onnegotiationneeded = (ev) => {
  pc.createOffer()
    .then((offer) => pc.setLocalDescription(offer))
    .then(() =>
      sendSignalingMessage({
        type: "video-offer",
        sdp: pc.localDescription,
      }),
    )
    .catch((err) => {
      // handle error
    });
};

有关更详细的示例,请参阅 开始协商

规范

规范
WebRTC:浏览器中的实时通信
# dom-rtcpeerconnection-onnegotiationneeded

浏览器兼容性

另见