0

だから私はシグナリングサーバーを介してwebRTCビデオ接続をセットアップしようとしていますsocket.io. 氷の候補を取得できるようになりましsetLocalDescriptionた。これは正しい方法であると信じていますが、氷の候補を追加するにはどうすればよいですか。次のようなものを使用する必要があるようですmyPeerConnection.addIceCandidate(RTCIceCandidate);が、これをリモート ピア接続とローカル ピア接続の両方に追加する必要がありますか? evt.candidatesをシグナリング サーバーに送信して、そこに追加しますか? もしそうなら、どのように?ピア接続に追加するための変数はグローバルではありません。私はこれに数日間取り組んできましたが、オンラインのチュートリアルよりも優れたガイドが必要なところに来ていると思います。見つけられるものはすべて調べました。

これは私のhtmlに添付されたコードです:client.js

var socket = io.connect();

var myPeerConnection;
var remotePeerConnection;
var offer;

var PeerConnectionWindow = (window.RTCPeerConnection || window.mozRTCPeerConnection 
|| window.webkitRTCPeerConnection || window.msRTCPeerConnection);
var SessionDescription = (window.RTCSessionDescription || window.mozRTCSessionDescription 
|| window.webkitRTCSessionDescription || window.msRTCSessionDescription);


    function hasUserMedia() { 
   //check if the browser supports the WebRTC 
   return !!(navigator.getUserMedia || navigator.webkitGetUserMedia || 
      navigator.mozGetUserMedia || navigator.msGetUserMedia); 
}




if (hasUserMedia()) {

   var configuration = { 
      "iceServers": [{ "url": "stun:stun.1.google.com:19302" }] 
   }; 

   myPeerConnection = new PeerConnectionWindow(configuration);
   console.log(myPeerConnection);

   remotePeerConnection = new PeerConnectionWindow(configuration);
   console.log(remotePeerConnection);

   myPeerConnection.createOffer(gotDescription, onError);

   myPeerConnection.onicecandidate = function(evt){
      if(event.candidate){
         socket.emit('ice', JSON.stringify({'ice': evt.candidate}));
         remotePeerConnection.addIceCandidate(evt.candidate);
         console.log("connected my to remote");
      }
   };

   remotePeerConnection.onicecandidate = function(evt){
      if(event.candidate){
         socket.emit('ice', JSON.stringify({'ice': evt.candidate}));
         myPeerConnection.addIceCandidate(evt.candidate);
         console.log("connected my to remote");
      }
   };

   remotePeerConnection.onaddstream = function (evt) {
      console.log("on added stream");
      var remoteVid = document.getElementById('remote'); 

      remoteVid.src = window.URL.createObjectURL(evt.stream);
   }

   navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia
   || navigator.mozGetUserMedia || navigator.msGetUserMedia; 
   //enabling video and audio channels 
   navigator.getUserMedia({ video: true, audio: true }, function (stream) {  
      var video = document.getElementById('local');  
      // //inserting our stream to the video tag     
      video.src = window.URL.createObjectURL(stream);
      myPeerConnection.addStream(stream); 
   }, onError); 
} else { 
   alert("WebRTC is not supported"); 
}

function gotDescription(desc) {
   offer = desc
   myPeerConnection.setLocalDescription(offer, myPeerConnLocalDescSet, onError);
   socket.emit('description', JSON.stringify({'sdp': desc}));
}

function onError(err){
   console.log(err);
}

function myPeerConnLocalDescSet(){
   remotePeerConnection.setRemoteDescription(offer, remotePeerConnRemoteDescSet,onError);
}

function remotePeerConnRemoteDescSet(){
   remotePeerConnection.createAnswer(onAnswerCreated, onError);
}

function onAnswerCreated(description){
   answer = description;
   remotePeerConnection.setLocalDescription(answer, remotePeerLocalDescSet,onError);
}

function remotePeerLocalDescSet(){
   myPeerConnection.setRemoteDescription(answer, myPeerRemoteDescSet,onError);
}

function myPeerRemoteDescSet(){
   console.log('did we get it?');
}

これが私のシグナリング サーバーです: server.js

var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);



app.get('/', function(req, res){
   res.sendFile(__dirname + '/index.html');
});

app.use(express.static(__dirname + '/'));

server.listen(process.env.PORT || 3000, function(){
  console.log('listening on *:3000');
});


io.sockets.on('connection', function(socket){
    console.log("in the socket on server");

    socket.on('disconnect', function(){
        console.log('user disconnected');
    });
    socket.on('description', function(data){
        console.log(data);
    });
    socket.on('ice', function(data){
        // Do I attempt to add the candidate here like so?: myPeerConnection.addIceCandidate(new RTCIceCandidate(data));
    });
});

アップデート

すべてが順序どおりに流れているように見えるので、コードを更新しました。今は、2 つのピア間で SDP 情報を交換する方法についてのみサポートが必要です。私が今持っているのはSocket.io、両当事者が受け取り、適用するために送信されているということです...そうですか?誰かがこれがどのように行われるかのサンプルコードを持っていますか?彼らは説明を私に見せることができます. 助けてくれてありがとう!

4

2 に答える 2

0

最初の実装は常にトリッキーで、ICE 候補インターフェイス (アドオンとオン) は非常に紛らわしいものです。どのイベントがいつ呼び出され、どの API を使用する必要があるかについては、その図を参照してください。候補がローカルで作成された場合 (onIceCandidate イベント)、シグナリングを介してリモート側に渡す必要があり、そこに addIceCandidate API を使用して追加する必要があることがわかります。対称であるため、onIceCandidate は常にローカル候補を提供し、addIceCandidate は常にリモート候補を引数として受け取ります。

http://www.slideshare.net/alexpiwi5/overviewpeerconnectionlifetime

于 2016-09-17T19:48:32.803 に答える