Живой видеопоток на сервере Node.js

Я много разбираюсь в этом, но разочарован, поскольку я чувствую, что решение должно быть простым, хотя я знаю, что не буду. В идеале я просто хочу использовать узел для размещения сервера, webrtc getusermedia, чтобы получить прямой эфир на локальном клиенте и использовать что-то вроде socket.io для отправки потока на сервер, а затем сервер будет транслировать поток на удаленный клиент; как если бы это было простое приложение чата для обмена сообщениями.

Просто подумав об этом, еще немного кажется, что это простое было бы невозможно, потому что живое видео требует непрерывных больших объемов данных, которые не будут отправлены на одно сообщение или даже файл после события (кнопка отправки нажата),

Может быть, я ошибаюсь, может ли приложение видеопотока жить по той же структуре приложения node/socket.io messenger? Вы отправили бы медиа-объект, возвращенный из getUserMedia, blob, некоторые двоичные данные каким-то образом (я пробовал все это, но, возможно, не правильно).

Идеальной целью было бы приложение, которое при необходимости использовало бы как можно меньше лишнего пуха, так как небольшие установки для 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

Ответ 1

Старайтесь быть ясными и конкретными. Во-первых, здесь вы не используете WebRTC. getUserMedia() является частью навигатора WebAPI, который вы используете для получения медиапотока с камеры.

Использование WebRTC означает, что вы используете серверы ICE и STUN/TURN для сигнализации. Вы будете использовать ваш хост- сервер (Node) для указания конфигурации ICE, определения каждого пользователя и обеспечения возможности вызова друг друга.

Если вы хотите передать его через свой хост, возможно, вы должны передать его в куски и настроить свою собственную инфраструктуру сигнализации. Вы можете использовать Stream API с сокетом io для потоковой передачи данных в кусках (пакеты). См. Здесь Stream API (socket.io)

Кроме того, вы можете проверить живой пример WebRTC + Socket.io здесь: Socket.io | Видеообзоры WebRTC

Здесь вы можете найти дополнительную информацию: отправка медиа-потока на сервер Host