Node.js服务器上的实时视频流

时间:2017-03-15 07:41:54

标签: javascript node.js socket.io webrtc live-streaming

我一直在研究这个问题,但我很沮丧,因为我觉得解决方案应该简单,虽然我知道不会。理想情况下,我只想使用node来托管服务器,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 个答案:

答案 0 :(得分:16)

尽量清楚明确。 首先,您没有在这里使用WebRTC。 getUserMedia()是您用于从相机获取媒体流的导航器WebAPI 的一部分。

使用WebRTC意味着您正在使用ICE和STUN / TURN服务器进行信令。您将使用主机服务器(节点)来指定ICE配置,识别每个用户并提供相互呼叫的方式。

如果您想通过主机流式传输,可能应该将其以块的形式流式传输并设置自己的信令基础架构。您可以将Stream API与套接字io一起使用来以块(数据包)的形式传输数据。见Stream API(socket.io)

此外,您可以在此处查看WebRTC + Socket.io的实例:Socket.io | WebRTC Video Chat

您可以在此处找到更多信息:sending a media stream to Host server