在webRTC呼叫中设置接收器

时间:2017-01-08 18:26:45

标签: javascript webrtc

我正在使用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(){};  

1 个答案:

答案 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