RTCPeerConnection: negotiationneeded 事件

当需要通过信令通道协商连接时,会向 RTCPeerConnection 发送 negotiationneeded 事件。这发生在连接的初始设置期间,以及通信环境发生任何需要重新配置连接的更改时。

当首次将媒体添加到连接时,negotiationneeded 事件首先分派到 RTCPeerConnection。这通过指示您的代码开始通过信令服务器交换 ICE 候选者来启动 ICE 协商过程。有关以 negotiationneeded 事件开始的信令过程的说明,请参阅 信令事务流程

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

语法

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

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

onnegotiationneeded = (event) => {};

事件类型

一个通用的 Event

示例

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

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

创建提供后,通过调用 RTCPeerConnection.setLocalDescription() 配置本地端;然后创建信令消息并将其通过信令服务器发送到远程对等方,以与其他对等方共享该提供。另一个对等方应该识别此消息,并随后创建自己的 RTCPeerConnection,使用 setRemoteDescription() 设置远程描述,然后创建要发送回提供对等方的应答。

您还可以通过将事件处理程序函数分配给 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

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅