RTCPeerConnection: icecandidate 事件
当以下情况发生时,会向 RTCPeerConnection
发送 icecandidate
事件:
- 已识别出
RTCIceCandidate
并通过调用RTCPeerConnection.setLocalDescription()
添加到本地对等体, - 已识别出与特定用户名片段和密码组合(生成)相关的每个
RTCIceCandidate
并已添加,以及 - 所有传输上的所有 ICE 收集已完成。
在前两种情况下,事件处理程序应通过信令通道将候选者传输到远程对等体,以便远程对等体可以将其添加到其远程候选者集中。
此事件不可取消,也不冒泡。
语法
在 addEventListener()
等方法中使用事件名称,或设置事件处理程序属性。
addEventListener("icecandidate", (event) => {});
onicecandidate = (event) => {};
事件类型
一个 RTCPeerConnectionIceEvent
。继承自 Event
。
事件属性
RTCPeerConnectionIceEvent
是一个 Event
,因此此事件还实现以下属性.
RTCPeerConnectionIceEvent.candidate
只读-
指示包含与事件关联的候选者的
RTCIceCandidate
。如果事件指示此生成中没有更多候选者,则此值为空字符串 (""
),如果所有传输上的所有 ICE 收集都已完成,则此值为null
。
描述
在 RTCPeerConnection
上触发 icecandidate
事件有三个原因。
共享新候选者
大多数 icecandidate
事件都会触发,以指示已收集到一个新候选者。此候选者需要通过您管理的信令通道传递给远程对等体。
rtcPeerConnection.onicecandidate = (event) => {
if (event.candidate !== null) {
sendCandidateToRemotePeer(event.candidate);
} else {
/* there are no more candidates coming during this negotiation */
}
};
远程对等体在收到候选者后,会通过调用 addIceCandidate()
将候选者添加到其候选者池中,并将您使用信令服务器传递的 candidate
字符串作为参数传入。
指示候选者生成结束
当 ICE 协商会话为给定 RTCIceTransport
用尽要提出的候选者时,它会完成对一生成候选者的收集。发生这种情况的标志是一个 icecandidate
事件,其 candidate
字符串为空 (""
)。
您应该像任何标准候选者一样将此传递给远程对等体,如上文 共享新候选者 中所述。这样可以确保远程对等体也能收到候选者结束通知。正如您在上一节代码中看到的,每个候选者都会发送给另一个对等体,包括任何可能具有空候选者字符串的候选者。仅当事件的 candidate
属性为 null
时,候选者才不会通过信令连接转发。
候选者结束指示在 Trickle ICE 草案规范的第 9.3 节 中进行了描述(请注意,该节号可能会随着规范经过反复草案而发生变化)。
指示 ICE 收集已完成
一旦所有 ICE 传输完成候选者的收集,并且 RTCPeerConnection
对象的 iceGatheringState
属性值已过渡到 complete
,则会发送一个 icecandidate
事件,其 candidate
值设置为 null
。
此信号是为了向后兼容而存在的,不需要继续传递给远程对等体(这就是上面的代码片段在将候选者转发之前检查 event.candidate
是否为 null
的原因)。
如果您需要在不再预期有更多候选者时执行任何特殊操作,最好通过监视 icegatheringstatechange
事件来监视 ICE 收集状态
pc.addEventListener("icegatheringstatechange", (ev) => {
switch (pc.iceGatheringState) {
case "new":
/* gathering is either just starting or has been reset */
break;
case "gathering":
/* gathering has begun or is ongoing */
break;
case "complete":
/* gathering has ended */
break;
}
});
如您在此示例中看到的那样,icegatheringstatechange
事件可以让您知道何时 RTCPeerConnection
属性 iceGatheringState
的值已更新。如果该值现在是 complete
,则表示 ICE 收集刚刚结束。
这比查看指示 ICE 会话已结束的单个 ICE 消息更可靠。
示例
此示例创建了一个简单的 icecandidate
事件处理程序,它使用名为 sendMessage()
的函数通过信令服务器创建并发送对远程对等体的回复。
首先,使用 addEventListener()
的示例
pc.addEventListener(
"icecandidate",
(ev) => {
if (ev.candidate !== null) {
sendMessage({
type: "new-ice-candidate",
candidate: ev.candidate,
});
}
},
false,
);
您也可以直接设置 onicecandidate
事件处理程序属性
pc.onicecandidate = (ev) => {
if (ev.candidate !== null) {
sendMessage({
type: "new-ice-candidate",
candidate: ev.candidate,
});
}
};
规范
规范 |
---|
WebRTC:浏览器中的实时通信 # dom-rtcpeerconnection-onicecandidate |
浏览器兼容性
BCD 表仅在浏览器中加载