3

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

次に、2 つのクライアントがあり、1 つは呼び出しを行う 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 Web サイトの指示に従いました: http://peerjs.com/

4

2 に答える 2

0

あなたの 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 */
});

このリンクは、独自の TURN サーバーをデプロイする方法を提供します。

于 2016-11-23T07:51:15.760 に答える
0

httpsを使用していますか?非ローカル マシンへの呼び出しは、ブラウザで許可されなくなりました。

これをテストするには、両方のコード セットをローカル マシンで実行します。その接続ができれば、コードに問題がないことを意味します。

リモート接続を行うには、残念ながら https が必要です。これは、(https として実行するために) 独自の peerjs サーバーも必要になることを意味します。

もう 1 つのオプションは、ポート フォワーディングを使用して、いずれかのマシンがローカル ホストと通信していると認識させることです。

于 2016-11-22T20:36:56.287 に答える