2016-04-27 5 views
2

Ich implementiere jetzt den Quellcode von WebRTC Samples zu 3 Benutzer Verbindung durch Verwendung von Mesh-Topologie.WebRTC mit 3 Benutzer Verbindung

Allerdings funktioniert mein Code nicht, wie ich dachte, es wäre. Ich denke, ich bin beim Aufruf der Funktion iceCallBack# fest (# bezieht sich auf Nummer 1, 2, 3), weil das Ausgabeergebnis das gleiche wie das Original ist. Es kann nur 2 Benutzer verbinden.

Ich weiß nicht, wie es richtig zu beheben ist.

Hier einige meiner JavaScript-Code, die ich gearbeitet habe:

var audio2 = document.querySelector('audio#audio2'); 
 
    var audio3 = document.querySelector('audio#audio3'); 
 
    var pc1; 
 
    var pc2; 
 
    var pc3; 
 

 
    function call() { 
 
     callButton.disabled = true; 
 
     codecSelector.disabled = true; 
 
     trace('Starting call'); 
 
     var servers = null; 
 
     var pcConstraints = { 
 
     'optional': [] 
 
     }; 
 
     pc1 = new RTCPeerConnection(servers, pcConstraints); 
 
     trace('Created local peer connection object pc1'); 
 
     pc1.onicecandidate = iceCallback1; 
 

 
     pc2 = new RTCPeerConnection(servers, pcConstraints); 
 
     trace('Created remote peer connection object pc2'); 
 
     pc2.onicecandidate = iceCallback2; 
 
     pc2.onaddstream = gotRemoteStream; 
 
     trace('Requesting local stream'); 
 

 
     pc3 = new RTCPeerConnection(servers, pcConstraints); 
 
     trace('Created remote peer connection object pc2'); 
 
     pc3.onicecandidate = iceCallback3; 
 
     pc3.onaddstream = gotRemoteStream2; 
 
     trace('Requesting local stream'); 
 

 
     navigator.mediaDevices.getUserMedia({ 
 
     audio: true, 
 
     video: false 
 
     }) 
 
     .then(gotStream) 
 
     .catch(function(e) { 
 
     alert('getUserMedia() error: ' + e.name); 
 
     }); 
 
    } 
 

 

 
    //Description of pc1 creating offer to pc2 
 
    function gotDescription1(desc) { 
 
     desc.sdp = forceChosenAudioCodec(desc.sdp); 
 
     trace('Offer from pc1 \n' + desc.sdp); 
 
     pc1.setLocalDescription(desc, function() { 
 
     pc2.setRemoteDescription(desc, function() { 
 
      pc2.createAnswer(gotDescription2, onCreateSessionDescriptionError); 
 
     }, onSetSessionDescriptionError); 
 
     }, onSetSessionDescriptionError); 
 
    } 
 

 
    //Description of pc1 creating offer to pc3 
 
    function gotDescription3(desc) { 
 
     desc.sdp = forceChosenAudioCodec(desc.sdp); 
 
     trace('Offer from pc1 \n' + desc.sdp); 
 
     pc1.setLocalDescription(desc, function() { 
 
     pc3.setRemoteDescription(desc, function() { 
 
      pc3.createAnswer(gotDescription4, onCreateSessionDescriptionError); //Must edit gotDescription4 
 
     }, onSetSessionDescriptionError); 
 
     }, onSetSessionDescriptionError); 
 
    } 
 

 
    //Creating answer from pc2 
 
    function gotDescription2(desc) { 
 
     desc.sdp = forceChosenAudioCodec(desc.sdp); 
 
     pc2.setLocalDescription(desc, function() { 
 
     trace('Answer from pc2 \n' + desc.sdp); 
 
     pc1.setRemoteDescription(desc, function() { 
 
     }, onSetSessionDescriptionError); 
 
     }, onSetSessionDescriptionError); 
 
    } 
 

 
    //Creating answer from pc3 
 
    function gotDescription4(desc) { 
 
     desc.sdp = forceChosenAudioCodec(desc.sdp); 
 
     pc3.setLocalDescription(desc, function() { 
 
     trace('Answer from pc2 \n' + desc.sdp); 
 
     pc1.setRemoteDescription(desc, function() { 
 
     }, onSetSessionDescriptionError); 
 
     }, onSetSessionDescriptionError); 
 
    } 
 

 
    function iceCallback1(event) { 
 
     if (event.candidate) { 
 
     pc2.addIceCandidate(new RTCIceCandidate(event.candidate), 
 
      onAddIceCandidateSuccess, onAddIceCandidateError); 
 
     pc3.addIceCandidate(new RTCIceCandidate(event.candidate), 
 
      onAddIceCandidateSuccess, onAddIceCandidateError); 
 
     trace('Local ICE candidate: \n' + event.candidate.candidate); 
 
     } 
 
    } 
 

 
    function iceCallback2(event) { 
 
     if (event.candidate) { 
 
     pc1.addIceCandidate(new RTCIceCandidate(event.candidate), 
 
      onAddIceCandidateSuccess, onAddIceCandidateError); 
 
     pc3.addIceCandidate(new RTCIceCandidate(event.candidate), 
 
      onAddIceCandidateSuccess, onAddIceCandidateError); 
 
     trace('Remote ICE candidate: \n ' + event.candidate.candidate); 
 
     } 
 
    } 
 

 
    function iceCallback3(event) { 
 
     if (event.candidate) { 
 
     pc1.addIceCandidate(new RTCIceCandidate(event.candidate), 
 
      onAddIceCandidateSuccess, onAddIceCandidateError); 
 
     pc2.addIceCandidate(new RTCIceCandidate(event.candidate), 
 
      onAddIceCandidateSuccess, onAddIceCandidateError); 
 
     trace('Remote ICE candidate: \n ' + event.candidate.candidate); 
 
     } 
 
    }
<div id="audio"> 
 
     <div> 
 
     <div class="label">Local audio:</div><audio id="audio1" autoplay controls muted></audio> 
 
     </div> 
 
     <div> 
 
     <div class="label">Remote audio2:</div><audio id="audio2" autoplay controls></audio> 
 
     </div> 
 
     <div> 
 
     <div class="label">Remote audio3:</div><audio id="audio3" autoplay controls></audio> 
 
     </div> 
 
</div>

Hinweis: ich mit WebRTC bin neu. Ich könnte irgendwie dumm sein, bitte vergib mir.

Vielen Dank.

+0

Entschuldigung, dies ist keine Debug-Site. Lust auf eine Frage? – jib

+0

Kann 'RTCPeerConnection(). AddIceCandidate()' 2 Mal gleichzeitig verwendet werden? Weil ich möchte, dass es in zwei Richtungen kommuniziert. Zum Beispiel A -> B, C. B -> A, C. C -> A, B –

Antwort

4

Ein Netz von 3 Benutzern bedeutet, dass jeder Benutzer zwei Verbindungen einrichtet, eine für jeden der beiden anderen Benutzer. An jedem Client sind dies zwei völlig unterschiedliche RTCPeerConnections, und Sie können keine Kandidaten zwischen ihnen wiederverwenden, da jeder Kandidat Portnummern enthält, die speziell für den Datenträger und das Ziel, an das er gesendet werden soll, zugewiesen sind.

Wenn Sie wissen, wie Sie eine Verbindung einrichten, wissen Sie, wie Sie zwei einrichten. Halte die Dinge einfach getrennt.

+0

Vielen Dank! –