我在Chrome浏览器中遇到了一个非常奇怪的行为WebRTC。我使用像这样的简单代码:
peerConn.onicecandidate = function (event) {
if (event.candidate) {
let candidate = new RTCIceCandidate(event.candidate)
// Send the -candidate - to the remote peer
} else {
console.log('all candidates are set');
}
}
和这个:
function obtainCandidatesFromSignalServer (){
console.log('obtain candidates ...');
peerConn.addIceCandidate(candidate);
}
我希望在对等方A和对等方B交换offer
和answer
之后调用该事件,但事实并非如此。当我仅将offer
从A发送到B时,触发了onicecandidate
事件,直到对等B不发送answer
为止,gettainCandidatesFromSignalServer函数将失败。那么,如何仅在onicecandidate
-offer
交换之后才能调用answer
函数?
答案 0 :(得分:0)
您遇到的错误是什么?我从不需要在特定时间设置onicecandidate
。
我怀疑错误是另外一回事:为什么new RTCIceCandidate(event.candidate)
已经是RtcIceCandidate的实例(请参阅https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnectionIceEvent/candidate)时,为什么要创建event.candidate
?我猜想在调用新的RtcIceCandidate时,您正在创建一个无效的候选项并将其发送给另一个对等点,从而出错。
答案 1 :(得分:0)
我希望该事件在对等方A和对等方B交换报价和答案之后被调用,但事实并非如此。
这种期望是不正确的。 Trickle ICE的全部重点是加快谈判速度,因此要约人候选人立即追逐要约,反之,答应人候选人追逐答案。
换句话说,您将在信令信道上看到的一种方式是:
offer candidate candidate candidate
...反之亦然:
answer candidate candidate candidate
将其视为对发送的描述的更新。实际上,如果要等几秒钟再发送pc.localDescription
,则说明将已经包含所有候选项,因此您无需滴答它们。 Trickle ICE是一种优化,因为连接时间通常很关键。