【发布时间】:2019-02-10 05:19:16
【问题描述】:
我正在创建一个 Web 应用程序,用于使用 WebRTC 由智能手机监控,而我正在使用 socket.io 为信令服务器。
当我发送流时,我会在接收该流的“监视”页面上创建一个 RTCPeerConnection 对象。我在单独的页面上发送流。用户最多可以附加来自智能手机的四个流,因此在“观看”页面上最多有四个 RTCPeerConnection 对象。
一旦出现“传输”页面的报价,就会自动接收流,然后在“观看”页面上创建 RTCPeerConnection 对象并连接到标准 WebRTC 架构。
“传输”页面:
function onCreateOfferSuccess(sdp){
//console.log(sdp);
pc.setLocalDescription(new RTCSessionDescription(sdp));
console.log('ask');
socket.emit('ask', {"sdp":JSON.stringify(pc.localDescription),
"user": loggedUserID,
"fromSocket": ownSocket});
}
“观看”页面:
socket.on('ask', function(offer){
if (offer.user === loggedUserID){
TempDescriptions = JSON.parse(offer.sdp);
console.log(TempDescriptions)
currTransmiterSocket = offer.fromSocket;
console.log(currTransmiterSocket);
getStream();
}
function getStream(){
try {
setTimeout(function(){
console.log(time, 'getStream()');
connection = getPeerConnection();
connection.setRemoteDescription(
new RTCSessionDescription(TempDescriptions),
function() {
connection.createAnswer(gotDescription, function(error){
console.log(error)
});
}, function(error){
console.log(error)
});
}, getStreamDelay*3000)
getStreamDelay++
}
catch(err){
console.log(err);
}
};
我的 Web 应用程序需要这样的功能,当我们退出“观看”页面并再次返回时,必须显示之前包含的所有流。
为了实现这个功能,我使用了 oniceconnectionstatechange 方法。如果流断开连接,则执行 iceRestart 函数,该函数使用选项 {iceRestart: true}
创建报价“传输”页面:
var options_with_restart = {offerToReceiveAudio: false,
offerToReceiveVideo: true,
iceRestart: true};
function iceRestart(event){
try{
setTimeout(function(){
pc.createOffer(options_with_restart).then(onCreateOfferSuccess, onCreateOfferError);
},1000);
} catch(error) {
console.log(error);
问题是当我重新启动“观看”页面时,所有页面“传输”立即发送询问。虽然一次创建了四个 RTCPeerConnection 对象(假设用户发送四个流),但只有一个对象被连接。
我已经为这个问题苦苦挣扎了好几天。如上面的代码所示,我尝试在对 getStream() 函数的后续调用中设置增加的时间延迟,我尝试在执行 getStream()signallingState 连接/em> 函数,我尝试了其他几种方法,但都没有奏效。
如果您需要我的部分代码来提供帮助,请写信。
编辑:
“观看”页面中的 gotDescription() 方法。
function gotDescription(sdp) {
try{
connection.setLocalDescription(sdp,
function() {
registerIceCandidate();
socket.emit('response', {"sdp": sdp,
"user": loggedUserID,
"fromSocket": ownSocket,
"toSocket": currTransmiterSocket});
}, function(error){
console.log(error)
});
} catch(err){
console.log(err);
}
}
我用RTCPeerConnection object添加console.log
控制台输出: https://i.stack.imgur.com/dQXkE.png1
日志显示连接的signalingState 是“稳定的”,但是当我开发对象时,signalingState 等于“have-remote-offer”
【问题讨论】:
标签: javascript node.js socket.io webrtc rtcpeerconnection