Node.js服务器上的实时视频流 [英] Live Video Stream on a Node.js Server

查看:1190
本文介绍了Node.js服务器上的实时视频流的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我一直在进行大量研究,但感到沮丧,因为我认为解决方案应该简单,尽管我知道不会.理想情况下,我只想使用节点来托管服务器,使用webrtc getusermedia来获取本地客户端上的实时流,并使用诸如socket.io之类的内容将流发送到服务器,然后服务器将流广播到远程.客户;好像它是一个简单的消息聊天应用程序.

I have been researching this a lot but am frustrated as I feel like the solution should be simple though I know wont be. Ideally i'd just want to use node to host the server, webrtc getusermedia to get the live stream on the local client and use something like socket.io to send the stream to the server and then the server would broadcast the stream to the remote client; as if it was a simple messaging chat app.

再多考虑一下,这种简单的方法似乎是不可能的,因为实况视频需要连续发送大量数据,这不等于在事件发生后发送单个消息甚至文件(发送按钮).

Just thinking about this some more it seems as an approach this simple would be impossible because a live video requires continuous large amounts of data to be sent, which does not equate to sending a single message or even file after an event (send button pressed).

但是,也许我错了,实时视频流应用程序可以遵循node/socket.io Messenger应用程序的相同结构吗?您是否要发送从getUserMedia返回的媒体对象,blob,一些二进制数据(我已经尝试了所有这些方法,但是可能不正确).

Maybe I am wrong however, can a live video stream app follow the same structure of a node/socket.io messenger app? Would you send the media object returned from getUserMedia, the blob, some binary data some how (I've tried all of these but perhaps not correctly).

理想的目标是应用程序使用必要的多余的绒毛,安装npm,安装额外的javascript库,或担心编码/解码或其他麻烦的ICE或惊呆了.有什么办法可能吗?还是我要求太多?

The ideal goal would be an app that uses as little extra fluff as necessary, as little npm installs, as little extra javascript libraries, or little worrying about encoding/decoding or whatever the hell ICE or STUN are. Is there any way this is possible or am I asking for too much?

理想客户

    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/

This is the broken app in action : https://nodejs-videochat.herokuapp.com/

这是github上损坏的代码: https://github.com/joshydotpoo/nodejs-videochat

This is the broken code on github: https://github.com/joshydotpoo/nodejs-videochat

推荐答案

请尝试清楚明确. 首先,您在这里不使用WebRTC. getUserMedia()导航器WebAPI 的一部分,您将使用它从相机获取媒体流.

Try to be clear and specific. First, you are not using WebRTC here. getUserMedia() is a part of navigator WebAPI which you are using to get media stream from the camera.

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

Using WebRTC means you are using ICE and STUN/TURN servers for the purpose of signaling. You will use your host server(Node) for specifying ICE configuration, identify each user and provide a way to call each other.

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

If you want to stream it through your host, probably you should stream it in chunks and set up your own signaling infrastructure. You can use Stream API with socket io to stream data in chunks(packets). See here Stream API(socket.io)

此外,您还可以在此处查看WebRTC + Socket.io的实时示例: Socket.io | WebRTC视频聊天

Also, you can check out the live example of WebRTC + Socket.io here: Socket.io | WebRTC Video Chat

您可以在此处找到更多信息:

You can find out more information here: sending a media stream to Host server

这篇关于Node.js服务器上的实时视频流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆