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