2016-11-22 10 views
0

Я пытаюсь получить простой видео-чат, работающий с PeerJS. Я хочу отправить аудио между Firefox на ПК и Firefox на Android. Я могу запустить вызов (call.on), и я могу просматривать локальное видео, но по какой-то причине медиа просто не дошло до другого пользователя. В настоящее время я получаю сообщение об ошибке:ICE не удалось, вызов PeerJS начался, но нет видео/аудио через

ICE failed, see about:webrtc for more details

У меня есть сервер, который в его простой версии, как например:

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

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

Тогда у меня есть два клиента, один для ПК, что делает вызов:

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

И тот, который отвечает на вызов:

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

Я думаю, что это небольшая настройка, что я ошибаюсь. В основном я слежу за инструкциями на веб-сайте PeerJS: http://peerjs.com/ Пожалуйста, если кто-нибудь увидит что-то, что нужно изменить, любая помощь приветствуется!

ответ

0

Вы используете https? Браузеры больше не разрешают делать вызовы на нелокальные машины.

Чтобы проверить это, запустите оба набора кода на вашем локальном компьютере. Если вы можете сделать это соединение, значит, ваш код в порядке.

Для удаленного подключения вам, к сожалению, потребуется https. Это означает, что вам также понадобится ваш собственный сервер peerjs (для запуска в виде https).

Другой вариант заключается в использовании перенаправления портов, чтобы сделать один из машин думаю, что разговаривает с локального сервера

0

Это звучит как ICE Кандидаты не могут общаться друг друг к другу. Вам понадобится использовать STUN-сервер, и если он все еще не работает, вам понадобится сервер TURN.

От PeerJS Документация:

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

Это link предоставит вам метод для развертывания собственного сервера TURN.

+0

Спасибо за ответ, надеюсь, я смогу куда-нибудь с этим поработать. Поэтому я настроил сервер TURN на моем ubuntu, и я запускаю демона. Я изменил новый Peer на: var var = new Peer ({ config: {'iceServers': [ {urls: 'stun: stun.l.google.com: 19302'}, {urls: 'turn: https://myurl.com:3478 ', учетные данные:' test ', имя пользователя:' test '} ]} }); 'и я поменял местный peer.js на https://cdnjs.cloudflare.com/ ajax/libs/peerjs/0.3.14/peer.js, поскольку он жаловался на несоответствие https/http, но теперь я получаю «ReferenceError: Peer не определен». – suppp111

+0

Нужно ли мне все еще запускать собственный сервер Peer? Я думал, что не буду, потому что я больше не назову его ... другой вариант заключается в том, что этот peer.js на самом деле больше не работает, поскольку я получаю ошибку «change to urls». – suppp111

+0

Если вы не работаете полностью в своей собственной сети, серверы peerjs, stun и turn all должны быть в Интернете, а не на вашей собственной машине – Mikkel