我正在使用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永远不会被调用。
答案 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;