wake-up-neo.net

Live-Videostream auf einem Node.js-Server

Ich habe dies viel recherchiert, bin aber frustriert, da ich der Meinung bin, dass die Lösung einfach sein sollte , obwohl ich weiß, dass dies nicht der Fall ist. Idealerweise würde ich nur den Knoten zum Hosten des Servers verwenden wollen, webrtc getusermedia, um den Live-Stream auf dem lokalen Client abzurufen, und so etwas wie socket.io, um den Stream an den Server zu senden, und dann würde der Server den Stream an die Fernbedienung senden Klient; als ob es eine einfache Messaging-Chat-App wäre.

Wenn man nur ein bisschen darüber nachdenkt, scheint es, als wäre ein derart einfacher Ansatz unmöglich, da für ein Live-Video kontinuierlich große Datenmengen gesendet werden müssen, was nicht mit dem Senden einer einzelnen Nachricht oder sogar einer Datei nach einem Ereignis gleichkommt (Senden-Taste gedrückt). .

Vielleicht irre ich mich aber, kann eine Live-Video-Stream-App der gleichen Struktur einer Node/Socket.io-Messenger-App folgen? Würden Sie das von getUserMedia zurückgegebene Medienobjekt senden, das Blob, einige Binärdaten, einige wie (ich habe all dies versucht, aber vielleicht nicht richtig).

Das ideale Ziel wäre eine App, die so wenig wie nötig extra Fluff verwendet, so wenig wie Npm installiert, so wenig wie zusätzliche Javascript-Bibliotheken oder sich nur wenig Gedanken über das Kodieren/Dekodieren oder was auch immer zum Teufel ICE oder STUN macht sind. Ist das auf irgendeine Weise möglich oder verlange ich zu viel?

Idealer Kunde

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

    });

Ideal Server

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

Dies ist die kaputte App in Aktion: https://nodejs-videochat.herokuapp.com/

Dies ist der fehlerhafte Code auf github: https://github.com/joshydotpoo/nodejs-videochat

24
joshy.poo

Versuche klar und spezifisch zu sein. Erstens verwenden Sie hier nicht WebRTC. getUserMedia () ist ein Teil der Navigator-WebAPI , die Sie verwenden Medienstream von der Kamera abrufen.

Die Verwendung von WebRTC bedeutet, dass Sie ICE- und STUN/TURN-Server zum Zweck der Signalisierung verwenden. Sie verwenden Ihren Host Server (Node) zur Angabe der ICE-Konfiguration, identifizieren jeden Benutzer und bieten eine Möglichkeit, sich gegenseitig anzurufen.

Wenn Sie es über Ihren Host streamen möchten, sollten Sie es wahrscheinlich in Blöcken streamen und Ihre eigene Signalinfrastruktur einrichten. Sie können die Stream-API mit Socket io verwenden, um Daten in Blöcken (Paketen) zu streamen. Siehe hier Stream API (socket.io)

Sie können sich auch das Live-Beispiel von WebRTC + Socket.io hier ansehen: Socket.io | WebRTC Video Chat

Weitere Informationen finden Sie hier: Senden eines Medienstreams an den Hostserver

16