我的问题是关于 webrtc 协商。
许多在线教程和 MDN 中描述的内容存在矛盾。
在 MDN 中,它说链接
在每一代候选者结束时,以候选者属性为空字符串的 RTCIceCandidate 形式发送候选者结束通知。仍然应该像往常一样使用 addIceCandidate() 方法将此候选者添加到连接中,以便将该通知传递给远程对等方。
如果在当前协商交换期间根本没有更多候选者,则通过传递候选者属性为空的 RTCIceCandidate 来发送候选者结束通知。此消息不需要发送到远程对等方。这是一个状态的遗留通知,可以通过观察 iceGatheringState 更改为完成,通过观察 icegatheringstatechange 事件来检测。
但是,在这里的教程中,他们介绍了以下代码
function handleICECandidateEvent(event) {
if (event.candidate) {
sendToServer({
type: "new-ice-candidate",
target: targetUsername,
candidate: event.candidate
});
}
}
如果 Candidate 是一个空字符串,它将被评估为 falsy 并且不会通过sendToServer
.
更有趣的是,即使在同一篇文章中
他们有以下示例代码
rtcPeerConnection.onicecandidate = (event) => {
if (event.candidate) {
sendCandidateToRemotePeer(event.candidate)
}
}
但是在这个片段的正下方,他们说
当 ICE 谈判会话中没有候选人为给定的 RTCIceTransport 提出建议时,它已经完成了一代候选人的收集。这由一个候选字符串为空 ("")的 icecandidate 事件指示。
您应该像任何标准候选人一样将其交付给远程对等方,如上面共享新候选人中所述。这可确保远程对等方也收到候选结束通知。
实际上,我阅读了许多在线教程,但我从未见过他们处理空字符串候选者的任何地方。