WebRTC双视频提供消息
问题描述:
我正尝试与WebRTC建立视频聊天。我有这个问题,是该视频的报价在双方打算像:WebRTC双视频提供消息
PC1 -> send video-offer
PC2 <- handle video-offer message
PC2 -> send video-answer
PC1 <- handle video-answer (when there is debugger breakpoint, the connection is working)
PC2 -> send video-offer
...
我只在negotiationEventHandler发送视频提供消息:
function handleNegotiationNeededEvent() {
logMessage('HandleNegotiationNeededEvent fired!');
myPeerConnection.createOffer() //tworzymy SDP offer dla drugiego uzytkownika
.then(function (offer) {
return myPeerConnection.setLocalDescription(offer);
})
.then(function() {
sendToWebSocket(msgTypeVideoOffer, senderId, receiverId, JSON.stringify(myPeerConnection.localDescription));
})
.catch(reportError);
}
和处理视频报价/视频抢答两个功能
function handleVideoOfferMsg(msg){
logMessage("handle video-offer message call");
var localStream = null;
createPeerConnection();
var desc = new RTCSessionDescription(JSON.parse(msg.messageContent));
debugger;
myPeerConnection.setRemoteDescription(desc)
.then(function() {
return navigator.mediaDevices.getUserMedia(mediaConstraints);
})
.then(function (stream) {
localStream = stream;
document.getElementById("local_video").srcObject = localStream;
myPeerConnection.addStream(localStream);
})
.then(function() { //Utworz odpowiedz
return myPeerConnection.createAnswer();
})
.then(function (answer) { //Ustaw ja sobie jako lokalna
return myPeerConnection.setLocalDescription(answer);
})
.then(function() { //I wyslij SDP do peera
sendToWebSocket(msgTypeVideoAnswer, senderId, receiverId, JSON.stringify(myPeerConnection.localDescription));
})
.catch(handleGetUserMediaError);
}
function handleVideoAnswerMessage(message) {
logMessage("handle video answer message" + message);
var desc = message.messageContent;
myPeerConnection.setRemoteDescription(JSON.parse(desc));
}
的问题是,在处理视频报价树立了一个新的对象,什么可能是失去联系的原因。
答
这是一个bug in the Chrome browser。 MDN是正确的,这在Firefox中正常工作。
对于基本的sendrecv
音频+视频报价,应答应允许添加一个视频和一个音频流,并且在没有发起negotiationneeded
事件的情况下请拨打setLocalDescription
。
在预期的音频和视频被添加后,Chrome未能在回答者侧clear negotiationneeded,并且事实上将永远需要来回谈判。
答
答案是,当每次调用RTCPeerConnection.addStream()函数成功调用时,会触发negotiationneeded事件。所以我的解决办法是检查是否只邀请有这样的事件处理程序集:
if(isInviter){
myPeerConnection.onnegotiationneeded = handleNegotiationNeededEvent;
}
我的问题代码是基于Mozilla的WebRTC信号样品,这是绝对错误的实现,因此使用它要小心:https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling