2016-11-14 5 views
1

私はWebRTCでビデオチャットを構築しようとしています。WebRTC double video-offerメッセージ

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); 
} 

とビデオオファーを扱う:私だけnegotiationEventHandlerでビデオオファーメッセージを送信してい

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 
... 

:私が持っている問題は、ビデオ・オファーは以下のように両側に起こっているということです/ビデオ-答え二つの機能

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でうまく動作します。

基本的な音声とビデオのオファーの場合、回答者は1つのビデオと1つの音声ストリームを追加し、negotiationneededイベントを発生させずにsetLocalDescriptionと呼ぶことを許可する必要があります。

Chromeは、期待されるオーディオとビデオが追加された後に回答者側でclear negotiationneededに失敗します。実際には交渉は永遠に前後する必要があります。

0

答えは、RTCPeerConnection.addStream()関数が成功して呼び出されるたびに、その交渉が必要なイベントが発生することです。

は私の質問のコードは単に間違って実装されているモジラのWebRTCシグナリングのサンプルに基づいており、
if(isInviter){ 
     myPeerConnection.onnegotiationneeded = handleNegotiationNeededEvent; 
    } 

ので、それを使用して注意してください:https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Signaling_and_video_calling