我的问题是关于webrtc协商。
许多在线教程与MDN中描述的内容存在矛盾。
在MDN中,它说链接
在每一代候选人结束时,候选人结束通知以RTCIceCcandidate的形式发送属性是一个空字符串。此候选人仍应添加到使用addIceCandidate((方法的连接,以便将该通知传递给远程对等方。
当在当前协商交换,候选人结束通知为通过传递候选属性为null的RTCIceCcandidate发送。此消息不需要发送到远程对等端。这是一个状态的遗留通知,可以通过监视iceGatheringState更改为完成,通过监视用于icegatheringstatechange事件。
然而,在这里的教程中,他们介绍了以下代码
function handleICECandidateEvent(event) {
if (event.candidate) {
sendToServer({
type: "new-ice-candidate",
target: targetUsername,
candidate: event.candidate
});
}
}
如果候选者是一个空字符串,它将被评估为false,并且不会通过sendToServer
发送。
更有趣的是,即使在这里的同一篇文章中
他们有以下样本代码
rtcPeerConnection.onicecandidate = (event) => {
if (event.candidate) {
sendCandidateToRemotePeer(event.candidate)
}
}
但就在这个片段下面,他们说
当ICE谈判会议没有候选人可供提议时作为一个给定的RTCIceTransport,它已经完成了一代人的收集候选人。这种情况的发生是由一个icecandidate表示的事件,其候选字符串为空("(。
您应该像任何标准候选者一样将其传递给远程对等体,如上面共享新候选者中所述。这确保远程对等端得到候选端通知。
实际上,我读过很多在线教程,但从未见过它们处理空字符串候选者的地方。
旧规范不需要发送一个空的候选者,但新规范需要发送并添加一个空候选者。由于Chrome仍然是一个旧规范,当添加IceCandidate((时,空的候选者会导致错误,所以我不会发送它。