2016-11-22 3 views
0

Ich versuche, einen einfachen Video-Chat mit PeerJS zu arbeiten. Ich möchte Audio zwischen Firefox auf einem PC und Firefox auf Android senden. Ich kann den Anruf erhalten (call.on) und ich kann lokales Video ansehen, aber aus irgendeinem Grund kommt das Medium einfach nicht zum anderen Benutzer durch. Derzeit bin ich den Fehler bekommen:ICE fehlgeschlagen, PeerJS Anruf gestartet, aber kein Video/Audio über

ICE failed, see about:webrtc for more details

habe ich einen Server, der in seiner einfachen Version ist als solche:

var ip = require('ip'); 
    var PeerServer = require('peer').PeerServer; 

    var port = 9000; 
    var server = new PeerServer({port: port, allow_discovery: true}); 

Dann habe ich zwei Kunden, eine für den PC, die den Anruf macht:

var SERVER_IP = window.location.hostname; 
var SERVER_PORT = 9000; 
var localStream = ""; 
var peerID = "pc" 
var peerConnectionID = "and" 

var remoteVideo = document.querySelector('#rremote-video'); 
var localVideo = document.querySelector('#llocal-video'); 

var peer = new Peer(peerID, {host: SERVER_IP, port: SERVER_PORT}); 
var conn = peer.connect(peerConnectionID); 


var getUserMedia = navigator.mediaDevices.getUserMedia({ video: true, audio: true }) 
        .then(stream => localVideo.srcObject = stream) 
        .then(stream => localStream = stream) 
        .catch(e => console.log(e.name + ": "+ e.message)); 



waitForElement(); 

function waitForElement(){ 
    if(localStream != ""){ 

     conn.on('open', function(){ 
      conn.send('hi from PC!'); 
     }); 

     peer.on('connection', function(conn) { 
      conn.on('data', function(data){ 
      console.log(data); 
      }); 
     }); 

     console.log("we have a stream: "+localStream); 
     var call = peer.call(peerConnectionID, localStream); 
     console.log("Calling "+peerConnectionID); 
     call.on('stream', function(remotestream) { 
      console.log("Call on."); 
      remoteVideo.srcObject = remotestream; 
     }); 
    } 
    else{ 
     setTimeout(function(){ 
      waitForElement(); 
     },750); 
    } 
} 

Und derjenige, der den Anruf entgegennimmt ist:

var SERVER_IP = window.location.hostname; 
var SERVER_PORT = 9000; 
var localStream = ""; 
var peerID = "and" 
var peerConnectionID = "pc" 

var remoteVideo = document.querySelector('#rremote-video'); 
var localVideo = document.querySelector('#llocal-video'); 
var remoteAudio = document.querySelector('#remote-audio'); 
var localAudio = document.querySelector('#local-audio'); 


var peer = new Peer(peerID, {host: SERVER_IP, port: SERVER_PORT}); 
var conn = peer.connect(peerConnectionID); 


var getUserMedia = navigator.mediaDevices.getUserMedia({ video: true, audio: true }) 
                  .then(stream => localAudio.srcObject = stream) 
                  .then(stream => localVideo.srcObject = stream) 
                  .then(stream => localStream = stream) 
                  .catch(e =>  console.log(e.name + ": "+ e.message)); 

    waitForElement(); 

    function waitForElement(){ 
     if(localStream != ""){ 

     conn.on('open', function(){ 
      conn.send('hi from android!'); 
     }); 

     peer.on('connection', function(conn) { 
      conn.on('data', function(data){ 
      console.log(data); 
      }); 
     }); 

     peer.on('call', function(call) { 
      console.log("Picking up call."); 
      call.answer(localStream); 
      call.on('stream', function(remotestream) { 
       console.log("Call on."); 
       remoteVideo.srcObject = remotestream; 
      }); 
     }); 
    } 
    else{ 
     setTimeout(function(){ 
      waitForElement(); 
     },750); 
    } 
} 

Ich denke, es ist ein wenig zwicken, dass ich falsch liege, ich habe hauptsächlich Anweisungen auf PeerJS Website gefolgt: http://peerjs.com/ Bitte, wenn jemand etwas sehen kann, das geändert werden muss, ist jede Hilfe willkommen!

Antwort

0

Verwenden Sie https? Das Anrufen von nicht lokalen Computern ist von den Browsern nicht mehr erlaubt.

Führen Sie beide Code-Sätze auf Ihrem lokalen Computer aus, um dies zu testen. Wenn Sie diese Verbindung herstellen können, bedeutet dies, dass Ihr Code in Ordnung ist.

Um eine Remoteverbindung herzustellen, benötigen Sie leider https. Das bedeutet, dass Sie auch Ihren eigenen peerjs-Server benötigen (um als https zu laufen).

Die andere Option ist die Portweiterleitung zu verwenden, eine der Maschinen zu denken es auf den lokalen Host spricht

0

Es klingt wie Ihr ICE Kandidaten können nicht eins kommunizieren miteinander. Sie müssen einen STUN-Server verwenden, und wenn es immer noch nicht funktioniert, benötigen Sie einen TURN-Server.

Von PeerJS Dokumentation:

var peer = new Peer({ 
    config: {'iceServers': [ 
    { url: 'stun:stun.l.google.com:19302' }, 
    { url: 'turn:[email protected]:80', credential: 'homeo' } 
    ]} /* Sample servers, please use appropriate ones */ 
}); 

Diese link finden Sie eine Methode geben Sie Ihre eigenen TURN-Server zu implementieren.

+0

Danke für die Antwort, hoffentlich kann ich irgendwo damit kommen. Also habe ich einen TURN-Server auf meinem Ubuntu eingerichtet und ich betreibe den Dämon. Ich änderte den neuen Peer zu: 'var peer = new Peer ({ config: {'iceServers': [ {urls: 'stun: stun.l.google.com: 19302'}, {urls: 'drehen: https://myurl.com:3478 ', credential:' test ', username:' test '} }} }); 'und ich tauschte meine lokale peer.js zu https://cdnjs.cloudflare.com/ ajax/libs/peerjs/0.3.14/peer.js, da es sich über HTTPS/http-Inkonsistenz beschwert hat, aber jetzt bekomme ich einen "ReferenceError: Peer ist nicht definiert". – suppp111

+0

Muss ich noch meinen eigenen Peer-Server betreiben? Ich dachte, ich würde es nicht tun, da ich es nicht mehr wirklich anrufe ... Eine andere Option ist, dass diese peer.js nicht mehr funktioniert, da ich den Fehler "Änderung an URLs" erhalte. – suppp111

+0

Sofern Sie nicht vollständig in Ihrem eigenen Netzwerk arbeiten, müssen die peerjs, stun and turn Server alle im Internet sein, nicht auf Ihrem eigenen Rechner. – Mikkel