我正在使用webRTC打开2个用户之间的数据通道,该网站的简化版本是:
1个按钮用onclick =“myLive.initiateConnection()”创建调用
带有id =“caller”的1个输入,用于将SDP描述从第一个用户选项卡复制粘贴到第二个用户
1个按钮用onclick =“myLive.join()”接听电话
带有id =“callee”的1个输入,用于将SDP描述从第二个用户复制粘贴到第一个用户
带按钮的1个按钮=“setCallee($('#callee')。val())”将远程描述设置为第一个用户
我在joinConnection方法之前放置了join方法,因为如下所述,我认为错误是在join调用的gotCallerInfo中:
join = function(){
connection = new peerConnection(servers);
connection.onicecandidate = function(evt){
if(evt.candidate){
connection.addIceCandidate(new RTCIceCandidate(event.candidate));
}
};
connection.ondatachannel = function(ev){
dataChannel = ev.channel;
dataChannel.onmessage = receiveMessage;
ev.channel.onopen = function(){
alert('connection established, callee');
};
};
gotCallerInfo($("#caller").val())
};
gotCallerInfo = function(data){
var newDesc = JSON.parse(data);
connection.setRemoteDescription(new RTCSessionDescription(newDesc), function(){
connection.createAnswer(function(desc){
connection.setLocalDescription(desc);
此代码不通过webRTC连接2个用户。通过调整这里的代码并使用chrome进行测试,我注意到我可以通过点击两次加入按钮来使我的webRTC调用正常工作......或者在等待1s()之后再次调用createAnswer,webRTC调用可以使用chrome 。但是使用firefox,它会触发错误“createAnswer无法在状态稳定状态下调用”。为什么在超时后第二次调用createAnswer人为地解决了chrome的问题(不幸的是没有使用firefox)?我想我正在以错误的顺序做某事,但是setRemoteDescription,createAnswer和setLocalDescription的顺序正确。由第二个createAnswer创建的Desc2比第一个创建的desc长,所以我怀疑setLocalDescription会触发一些需要发送给调用者的ICE候选者的收集,在这种情况下,我怎么能让desc成为完整描述第一次调用createAnswer?
//setTimeout(function(){
//connection.createAnswer(function(desc){
$("#callee").val(JSON.stringify(desc));
//}, errorCallback);
//}, 1000);
}, errorCallback);
}, errorCallback);
};
我正在调用调用者使用的代码,以防错误源在错误本身之前开始。调用者通过单击“创建”按钮来运行initiateConnection方法。然后被调用者副本粘贴来自调用者选项卡的描述并单击join,然后调用者副本粘贴来自被调用者的描述并单击set callee description
initiateConnection = function(){
connection = new peerConnection(servers);
connection.onicecandidate = function(evt){
if(evt.candidate){
connection.addIceCandidate(new RTCIceCandidate(event.candidate));
}
};
dataChannel = connection.createDataChannel("channel");
dataChannel.onopen = function(){
alert('connection established, caller');
};
dataChannel.onmessage = receiveMessage;
connection.createOffer(function(description){
connection.setLocalDescription(description);
$("#caller").val(JSON.stringify(description));
}, errorCallback);
};
setCallee = function(data){
connection.setRemoteDescription(new RTCSessionDescription(JSON.parse(data)));
};
receiveMessage = function(){};
errorCallback = function(){};
答案 0 :(得分:1)
有几个问题:
connection.onicecandidate = function(evt){ if(evt.candidate){ connection.addIceCandidate(new RTCIceCandidate(event.candidate));
在这里,您将在同一个peerConnection上添加候选者,将其短路。不要那样做。
当然,使用cut'n'paste而不是发信号,你不需要涓涓细流。相反,忽略候选人并在复制要约或答案之前等待null
候选人。候选人会随着时间的推移自动添加到本地优惠/答案中。 null
标志着该过程的结束,在某些情况下可能需要<1秒到20秒(有时可以看到VPN,VM,多个网卡等)。
顺便说一句,这可能就是为什么等待一秒让它对你有用。
对于工作cut'n'paste示例,请参阅WebRTC, ice candidates connection