【问题标题】:ICE failed, PeerJS call started but no video/audio throughICE 失败,PeerJS 调用开始但没有视频/音频通过
【发布时间】:2016-11-22 19:39:18
【问题描述】:

我正在尝试使用 PeerJS 进行简单的视频聊天。我想在 pc 上的 Firefox 和 Android 上的 Firefox 之间发送音频。我可以让呼叫运行 (call.on),并且可以查看本地视频,但由于某种原因,媒体无法传递给其他用户。目前我收到错误:

ICE 失败,详情见 about:webrtc

我有一个服务器,它的简单版本是这样的:

    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/ 如果有人可以看到需要更改的内容,欢迎提供任何帮助!

【问题讨论】:

    标签: webrtc peerjs


    【解决方案1】:

    您使用的是 https 吗?浏览器不再允许调用非本地机器。

    要对此进行测试,请在本地计算机上运行两组代码。如果你能做到这一点,那就意味着你的代码是好的。

    不幸的是,要进行远程连接,您将需要 https。这意味着您还需要自己的 peerjs 服务器(以 https 方式运行)。

    另一种选择是使用端口转发让其中一台机器认为它正在与本地主机通信

    【讨论】:

    • 我有自己的 https 服务器来发送信号。仍然失败并显示以下消息:“ICE 失败,添加 TURN 服务器并查看 about:webrtc 了解更多详细信息”
    【解决方案2】:

    听起来您的 ICE 候选人无法相互交流。您将不得不使用 STUN 服务器,如果仍然无法正常工作,您将需要 TURN 服务器。

    来自 PeerJS 文档:

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

    link 将为您提供一种部署您自己的 TURN 服务器的方法。

    【讨论】:

    • 感谢您的回复,希望我能在这方面有所收获。所以我在我的 ubuntu 上设置了一个 TURN 服务器,我正在运行这个恶魔。我将新的 Peer 更改为:var peer = new Peer({ config: {'iceServers': [ { urls: 'stun:stun.l.google.com:19302' }, { urls: 'turn:https://myurl.com:3478', credential: 'test', username: 'test' } ]} }); 并将我的本地 peer.js 交换为 cdnjs.cloudflare.com/ajax/libs/peerjs/0.3.14/peer.js,因为它抱怨 https/http 不一致,但现在我收到“ReferenceError:Peer is not defined”。跨度>
    • 我还需要运行自己的 Peer 服务器吗?我以为我不会,因为我不再真正称呼它了……另一种选择是这个 peer.js 实际上不再工作了,因为我收到了“更改为 url”的错误。
    • 除非您完全在自己的网络中运行,否则 peerjs、stun 和 turn 服务器都需要在互联网上,而不是在您自己的机器上
    • 这是在 EC2 上运行的
    • 轮到你的网址语法有错误。它应该类似于:turn:myurl.com:3478。您必须删除 https:// 部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    相关资源
    最近更新 更多