候选人聚会期间不会触发onicegatheringstatechange事件

时间:2015-02-11 09:28:53

标签: webrtc

我正在编写一个webrtc应用程序,我无法使用涓流冰。所以我正在等待ICE候选人聚会完成并将报价发送给其他同行,以便ICE候选人被纳入SDP。我为onicegatheringstatechange设置了一个事件句柄,等待iceGatheringState改变。但是这个事件没有被触发。

pc = new RTCPeerConnection(peerConnectionConfig, peerConnectionConstraints);
pc.onicegatheringstatechange = onIceGatheringStateChange;

为了让它发挥作用,我还需要做些什么吗?

1 个答案:

答案 0 :(得分:1)

不要等待onicegatheringstatechange被调用。

这就是你应该做的事情:

  1. 使用onicecandidate函数接收候选冰。
  2. 当您收到" null"事件,你知道所有的候选人都收到了。
  3. 如果" null"没有通过计时器收到事件,仍然继续通话。
  4. 以下是您的代码的一个粗略示例(仅将其用作模板):

     var timer; // Some globally accessible timer variable
     var state = "not sent"; // Keep track of call state
    
     pc.onicecandidate = function(event) {
    
       if (!event.candidate) {
         // last candidate received. Check if SDP was already sent.
         if(state != "sent"){
            clearTimeout(timer);
            // Send SDP to remote peer:
            // Send pc.localDescription
            // Change call state to "sent"
         }
       }else{
         // Start a timer for the max "wait" time for ice candidates.
         timer = setTimeout(function(){
            // Ice gathering too slow, send SDP anyway.
            // Send pc.localDescription
            // Change call state to "sent"
         }, 1000);
       }
     }
    

    将onicecandidate事件与计时器一起使用非常重要,因为如果您使用多个Stun和Turn服务器,冰收集过程可能需要几秒钟,特别是在收到" null"事件。使用这种技术,您甚至可以在继续通话之前等待特定数量的候选人,因为您不需要所有候选人为您的应用程序生成适当的SDP。还有一种方法可以通过在每个冰候选者之间启动一个非常小的计时器来改进这种方法。

    在这个例子中,我设置了一个最大延迟为1000毫秒的计时器,因为我认为浏览器此时已收到一个可接受的冰候选者。您可以测试并查看最佳用户体验。