Strumień wideo na żywo na węźle.Serwer js

Badałem to dużo, ale jestem sfrustrowany, ponieważ czuję, że rozwiązanie powinno być proste, choć wiem, że nie będzie. Idealnie chciałbym po prostu użyć węzła do hostowania serwera, webrtc getusermedia, aby uzyskać strumień na żywo na lokalnym kliencie i użyć czegoś takiego socket.io aby wysłać strumień do serwera, a następnie serwer będzie transmitować strumień do zdalnego klienta; jakby to była prosta aplikacja do czatu wiadomości.

[[2]}Po prostu myślę o tym trochę więcej, wydaje się, że jako podejście to byłoby niemożliwe, ponieważ wideo na żywo wymaga ciągłego przesyłania dużych ilości danych, co nie oznacza wysłania pojedynczej wiadomości lub nawet pliku po zdarzeniu(naciśnij przycisk Wyślij).

Może jednak się mylę, czy aplikacja strumienia wideo na żywo może podążać za tą samą strukturą aplikacji node/socket.io messenger? Czy możesz wysłać obiekt multimedialny zwrócony z getUserMedia, blob, niektóre dane binarne trochę jak (próbowałem wszystkich tych, ale może nie poprawnie).

Idealnym celem byłaby aplikacja, która używa tak mało extra fluff , Jak to konieczne, jak mało npm instaluje, jak mało dodatkowych bibliotek javascript, lub trochę martwiąc się o kodowanie / dekodowanie lub cokolwiek do cholery lód lub ogłuszenie są. Czy jest to możliwe, czy proszę o zbyt wiele?

Ideal Client

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

To jest zepsuta aplikacja w akcji : https://nodejs-videochat.herokuapp.com/

To jest zepsuty kod na GitHubie: https://github.com/joshydotpoo/nodejs-videochat

Author: joshy.poo, 2017-03-15

1 answers

Staraj się być jasne i konkretne. Po pierwsze, nie używasz WebRTC tutaj. getUserMedia () jest częścią navigator WebAPI , której używasz do pobierania strumienia multimediów z aparatu.

Używanie WebRTC oznacza, że używasz serwerów ICE i STUN/TURN do celów sygnalizacji. Będziesz używać swojego serwera host do określenia konfiguracji ICE, identyfikacji każdego użytkownika i zapewnienia sposobu połączenia się.

Jeśli chcesz przesyłać strumieniowo przez swojego hosta, prawdopodobnie powinieneś streamować go w kawałkach i skonfigurować własną infrastrukturę sygnalizacyjną. Możesz użyć Stream API z socket io do przesyłania strumieniowego danych w kawałkach (pakietach). Zobacz tutaj Stream API(socket.io)

Możesz również sprawdzić przykład WebRTC + na żywo Socket.io tutaj: Socket.io / WebRTC Video Chat

Więcej informacji można znaleźć tutaj: wysyłanie strumienia multimedialnego do serwera hosta

 13
Author: Gaurav Chaudhary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:22