2016-11-14 61 views
1

我正嘗試與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)); 
} 

的問題是,在處理視頻報價樹立了一個新的對象,什麼可能是失去聯繫的原因。

回答

1

這是一個bug in the Chrome browser。 MDN是正確的,這在Firefox中正常工作。

對於基本的sendrecv音頻+視頻報價,應答應允許添加一個視頻和一個音頻流,並且在沒有發起negotiationneeded事件的情況下請撥打setLocalDescription

在預期的音頻和視頻被添加後,Chrome未能在回答者側clear negotiationneeded,並且事實上將永遠需要來回談判。

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