我们如何知道webRTC何时已完成收集ICE候选人

时间:2015-08-03 10:05:02

标签: webrtc kurento

我使用Kurento Utils与Kurento Media Server进行WebRTC连接(版本5.x)

在init期间,kurento-utils-js库中的简化代码如下所示:

if (!this.pc) {
    this.pc = new RTCPeerConnection(server, options);
}

var ended = false;
pc.onicecandidate = function(e) {
    // candidate exists in e.candidate
    if (e.candidate) {
        ended = false;
        return;
    }

    if (ended) {
        return;
    }

    var offerSdp = pc.localDescription.sdp;
    console.log('ICE negotiation completed');

    self.onsdpoffer(offerSdp, self);

    ended = true;
};

我的问题是它似乎等到onicecandidate传递“null”值表示进程已经结束并因此能够继续创建SDP提供,但我在WebRTC规范中找不到这种行为?

我的下一个问题是,我们怎么知道寻找冰候选人的过程已经结束了?

我办公室的一台电脑无法到达代码console.log('ICE negotiation completed');,因为没有传递空值。

2 个答案:

答案 0 :(得分:3)

http://www.w3.org/TR/webrtc/

4.3.1

“如果ICE代理的意图是通知脚本:

[...]

  • 收集过程已经完成。

将连接的冰采集状态设置为已完成,并将newCandidate设为null。“

所以,你可以检查冰收集状态与“完成”(在现实生活中,这不是非常可靠),或等待空候选(超级可靠)。

答案 1 :(得分:2)

您可以检查iceGatheringState属性(以chrome运行):



var config = {'iceServers': [{ url: 'stun:stun.l.google.com:19302' }] };
var pc = new webkitRTCPeerConnection(config);
pc.onicecandidate = function(event) { 
    if (event && event.target && event.target.iceGatheringState === 'complete') {
        alert('done gathering candidates - got iceGatheringState complete');
    } else if (event && event.candidate == null) {
        alert('done gathering candidates - got null candidate');
    } else {
          console.log(event.target.iceGatheringState, event);   
    }
};

pc.createOffer(function(offer) {
    pc.setLocalDescription(offer);
}, function(err) {
    console.log(err);
}, {'mandatory': {'OfferToReceiveAudio': true}});

window.pc = pc;