我正在尝试与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));
}
问题是,处理视频报价是设置新对象,这可能是丢失连接的原因。
答案 0 :(得分:1)
这是bug in the Chrome browser。 MDN是对的,这在Firefox中运行良好。
对于基本的sendrecv
音频+视频优惠,应该允许应答者添加一个视频和一个音频流,并在不触发setLocalDescription
事件的情况下调用negotiationneeded
。
在添加了预期的音频和视频后,Chrome在问答者方面未能clear negotiationneeded,并且事实上将继续来回进行永久的解决。
答案 1 :(得分:0)
答案是,每当成功调用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