2016-11-22 110 views
0

我正在尝试使用PeerJS进行简单的视频聊天。我想在PC上的Firefox和Android上的Firefox之间发送音频。我可以让呼叫在运行(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}); 

然后,我有两个客户,一个用于使调用PC:

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

感谢您的回复,希望我能在这个地方找到合适的位置。所以我在我的Ubuntu上设置了一个TURN服务器,我正在运行这个恶魔。我将新的Peer更改为:'var peer = new Peer({'iceServers':[{urls:'stun:stun.l.google.com:19302'}, {url:'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 is not defined”。 – suppp111

+0

我是否还需要运行我自己的对等服务器?我以为我不会这样做,因为我没有真正调用它...另一种选择是,这个peer.js实际上不再工作了,因为我得到了“更改为url”的错误。 – suppp111

+0

除非您完全在您自己的网络中运行,否则peerjs,stun和turn服务器都需要在互联网上,而不是在您自己的机器上 – Mikkel