我使用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');
,因为没有传递空值。
答案 0 :(得分:3)
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;