得到答案后启动`onicecandidate`事件

时间:2019-03-29 16:27:48

标签: javascript webrtc

我在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交换offeranswer之后调用该事件,但事实并非如此。当我仅将offer从A发送到B时,触发了onicecandidate事件,直到对等B不发送answer为止,gettainCandidatesFromSignalServer函数将失败。那么,如何仅在onicecandidate-offer交换之后才能调用answer函数?

2 个答案:

答案 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是一种优化,因为连接时间通常很关键。