web-dev-qa-db-ja.com

Node.jsサーバーでのライブビデオストリーム

私はこれについて多くのことを研究してきましたが、解決策はシンプルだと思うのでイライラしています理想的には、ノードを使用してサーバーをホストし、webrtc getusermediaでローカルクライアントのライブストリームを取得し、socket.ioのようなものを使用してストリームをサーバーに送信すると、サーバーはストリームをリモートにブロードキャストしますクライアント;まるでシンプルなメッセージングチャットアプリのように。

これについてもう少し考えると、ライブビデオでは大量のデータを連続して送信する必要があるため、この単純なアプローチは不可能であるように思われます。 。

たぶん間違っているかもしれませんが、ライブビデオストリームアプリはnode/socket.ioメッセンジャーアプリと同じ構造に従うことができますか? getUserMediaから返されたメディアオブジェクト、blob、バイナリデータを何らかの方法で送信しますか(これらすべてを試しましたが、おそらく正しくありません)。

理想的な目標は、必要に応じてextra fluffを使用する、npmをインストールする、追加のJavaScriptライブラリを使用しない、またはエンコード/デコードまたはその他何でも心配する必要のないアプリですICEまたはSTUNです。これが可能な方法はありますか?

理想的なクライアント

    var socket = io();
    var local = document.getElementById("local_video");
    var remote = document.getElementById("remote_video");

    // display local video
    navigator.mediaDevices.getUserMedia({video: true, audio: true}).then(function(stream) {
      local.src = window.URL.createObjectURL(stream);
      socket.emit("stream", stream);
    }).catch(function(err){console.log(err);});

    // displays remote video
    socket.on("stream", function(stream){
      remote.src = window.URL.createObjectURL(stream);

    });

理想的なサーバー

var app = require("express")();
var http = require("http").Server(app);
var fs = require("fs");
var io = require("socket.io")(http);

app.get('/', onRequest);
http.listen(process.env.PORT || 3000, function() {
    console.log('server started');
})

//404 response
function send404(response) {
    response.writeHead(404, {"Content-Type" : "text/plain"});
    response.write("Error 404: Page not found");
    response.end();
}

function onRequest(request, response) {
  if(request.method == 'GET' && request.url == '/') {
    response.writeHead(200, {"Content-Type" : "text/html"});
    fs.createReadStream("./index.html").pipe(response);
  } else {
    send404(response);
  }
}

io.on('connection', function(socket) {
  console.log("a user connected");
  socket.on('stream', function(stream) {
    socket.broadcast.emit("stream", stream);
  });
  socket.on('disconnect', function () {
    console.log("user disconnected");
  });
});

これは動作中の壊れたアプリです: https://nodejs-videochat.herokuapp.com/

これはgithubの壊れたコードです: https://github.com/joshydotpoo/nodejs-videochat

24
joshy.poo

明確かつ具体的になるようにしてください。まず、ここではWebRTCを使用していません。 getUserMedia()は、ナビゲーターWebAPIの一部であり、カメラからメディアストリームを取得します。

WebRTCを使用すると、シグナリングの目的でICEおよびSTUN/TURNサーバーを使用していることになります。 Hostserver(Node)を使用してICE構成を指定し、各ユーザーを識別して、お互いを呼び出す方法を提供します。

ホストを介してストリーミングする場合は、チャンクでストリーミングして、独自のシグナリングインフラストラクチャをセットアップする必要があります。ソケットioでStream APIを使用して、チャンク(パケット)でデータをストリーミングできます。こちらをご覧ください Stream API(socket.io)

また、ここでWebRTC + Socket.ioの実際の例を確認できます。 Socket.io | WebRTC Video Chat

詳細については、こちらをご覧ください: メディアストリームをホストサーバーに送信する

16