onaddstream在重新协商后从未打过电话

时间:2014-10-10 22:03:26

标签: javascript google-chrome firefox webrtc

我正在使用WebRTC创建测试视频聊天应用。我有两个对等连接成功。我想为用户添加一种方法来重新连接" (断开连接并与其他用户连接。出于测试目的,"其他"用户与之前的用户相同)。因此,当选择一个按钮时,将调用此代码:

send(userId, toUserId, {disconnect: "true"});
pc.removeStream(localStream);
pc.close();
pc = new PeerConnection(servers, options);
remoteVideo.src = "";

在上面的代码中,使用信令方法,一条消息被发送给另一个用户以提醒他们断开连接。然后,从对等连接中删除本地流,关闭连接,创建新的PeerConnection,并在加载另一个视频时将远程视频设置为空白。之后,我有一些代码找到另一个用户连接(用于测试案例的同一用户)并继续协商(遵循之前协商的相同代码)。

使用日志记录,似乎已达到每个步骤(offer / answer / icecandidate)。问题是永远不会到达onaddstream监听器。是的,在发送商品之前调用pc.addStream()。我正在使用包含流(localStream)的变量,因此我不必再次请求许可。我不确定这是不是问题。我的问题:为什么onaddstream没有被调用?

编辑:这里有更多代码。单击按钮时调用的方法:

function restart(){
    send(userId, toUserId, {disconnect: "true"});
    pc.removeStream(localStream);
    pc.close();
    pc = new PeerConnection(servers, options);
    remoteVideo.src = "";
    $.ajax({
        url: "http://localhost:8080/UserInterface/rs/message/creds/" + '#{sessionHandler.username}',
        type: "GET",
        success: function(data){
            data = JSON.parse(data);
            if (data != null){
                toUserId = data.toUserId;
                activeUser = data.activeUser;
                activeUser = JSON.parse(activeUser);
            }
            pc.addStream(localStream);
            sendOffer();
        }
    });
}

在上面的代码中,第一次调用getUserMedia()方法时获取localStream变量。这样,当我需要流时,我不必再次调用它。 sendOffer()方法:

function sendOffer(){
    pc.onicecandidate = iceCandidateFound;
    if (activeUser){
        $.ajax({
            url: "http://localhost:8080/UserInterface/rs/message/sessId/" + toUserId,
            type: "GET",
            success: function(data){
                toSessionId = data;
                pc.createOffer(function (offer) {
                    pc.setLocalDescription(offer);
                    var offerMessage = {
                        "offer": offer,
                    };
                    send(userId, toUserId, offerMessage);
                }, errorHandler, constraints);
            }
        });
    }
}

使用日志记录和chrome:// webrtc-internals,可见所有适当的步骤都已成功完成(例如,提供/回答)。包括信令在内的其余代码与第一次连接时使用的完全相同。唯一的问题是onaddstream永远不会被调用。

1 个答案:

答案 0 :(得分:3)

我的问题的解决方案很简单,而且我完全忽略了。我忘了在新的PeerConnection对象上重新声明事件监听器onaddstream。在我有这样的事情之前:

pc.onaddstream = function(ev){
    console.log("onaddstream");
    remoteVideo.src = URL.createObjectURL(ev.stream);
};

第一个视频连接工作正常。但是,在restart()方法中,我重新实例化了pc对象。像这样:

pc = new PeerConnection(servers, options);

但是,我没有将事件监听器放回到对象上。所以,我做的是做一个功能:

function remoteStreamAdded(ev){
    console.log("onaddstream");
    remoteVideo.src = URL.createObjectURL(ev.stream);
}

而且,每当我需要放置事件监听器时,我都可以调用此方法,如下所示:

pc = new PeerConnection(servers, options);
pc.onaddstream = remoteStreamAdded;