【问题标题】:Live Video Stream on a Node.js ServerNode.js 服务器上的实时视频流
【发布时间】:2017-08-05 20:03:20
【问题描述】:

我对此进行了很多研究,但我感到很沮丧,因为我觉得解决方案应该简单,尽管我知道不会。理想情况下,我只想使用 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

【问题讨论】:

  • @Profstyle 从我在您发布的 github 链接上看到的用于从视频中捕获单个帧并将其转换为视频?甚至使用 cpp 文件,但也许这只是为了让它与本机相机一起使用,而不仅仅是使用 webrtc 的东西......我真的试图保持这个简单

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


【解决方案1】:

尽量明确和具体。 首先,您在这里没有使用 WebRTC。 getUserMedia()navigator WebAPI 的一部分,您可以使用它从摄像头获取媒体流。

使用 WebRTC 意味着您使用 ICE 和 STUN/TURN 服务器来发送信号。您将使用您的主机服务器(节点)来指定 ICE 配置、识别每个用户并提供相互调用的方式。

如果您想通过您的主机流式传输它,您可能应该分块流式传输它并设置您自己的信号基础设施。您可以使用带有套接字 io 的 Stream API 以块(数据包)的形式流式传输数据。看这里Stream API(socket.io)

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

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

【讨论】:

  • 感谢您的更正。你说冰和眩晕/转弯服务器是用来发信号的,我还没有好好看看,所以如果一切都失败了,我会看看;但是socket.io不能用于信令吗?
  • 跟进问题,通过分块流式传输,您是否意味着一次发送实时视频的块,几乎就像录制视频的一部分并将其发送并显示,而下一个“部分”是被“记录”。抱歉,我只是想了解基础知识
  • @joshy.poo 是的,它可以用于信号目的,您可以使用它非常轻松地制作简单的文本聊天应用程序。你可以在这里看到link
  • 是的,我知道我自己做了一个,如果我自己这么说,它看起来很不错,;),但我的意思是我可以通过使用绕过必须使用 ICE 配置(等等) socket.io 作为我的信令服务器。我实际发送了哪些数据(流对象、blob 等)?
  • @joshy.poo 我已经修改了我的答案。是的,chunk 表示一个数据包,Stream API 提供了管道机制来执行相同的操作。我没有使用 socket.io 进行视频流,所以无法帮助您实现!
【解决方案2】:

我觉得题目是关于Node Server来支持Live Streaming或者Video Chat,比你想象的要复杂的多,让我来说明它。 直播视频聊天都可以使用WebRTC,但直播不需要使用WebRTC。两者都需要一些节点服务器来支持信令和流媒体。

如果您想将您的相机发布为直播,并转发给成千上万的玩家,这就是所谓的直播。延迟不是很关键,一般3~10s就可以了。

如果您想互相交谈,请使用您的相机,同时转发给其他用户,这称为视频聊天。延迟非常敏感,必须

它们完全不同,让我们分开讨论。

直播

直播的关键是跨平台(H5和移动),流畅无缓冲,快速启动切换流。流拱如下:

Publisher ---> Server/CDN ---> Player

再来说说播放器,HLS(LLHLS) 是一个首屈一指的交付协议,它被广泛使用并且在 H5(PC 和移动)和移动(iOS 和 Android)上运行良好。唯一的问题是延迟大约5~10s,甚至更大。因为它是基于文件的协议。

对于Chrome,也可以使用hls.js玩HLS,MSE

另外一个低延迟(3~5s)的协议也可以,它是HTTP-FLV,它被hls.js的所有PC-H5支持,ijkplayer的移动设备支持,并且一些CDN也支持这个协议。唯一的问题是对mobile-H5不友好。

对于播放器,WebRTC 也可以播放流,在 Chrome 等 PC-H5 上运行良好。问题出在移动端,运行 WebRTC 原生播放器非常困难。除了复杂之外,您还需要一个信令服务器,用于交换 SDP。

对于发布商来说,这很复杂,因为它取决于您的客户:

  • 如果是 H5 发布者,则只有 WebRTC 可用,因此您需要一个服务器将 WebRTC 转换为播放器协议。推荐SRS
  • 如果是 Native 移动发布者,推荐 FFmpeg,有很多库和绑定。任何 RTMP 服务器都可以,还有一些节点服务器。
  • 如果是电视设备,它可能使用 SRT,你还需要一个服务器来进行转换。再次推荐 SRS。

直播经济最终是基于C/C++的,FFmpeg/WebRTC/SRS是C/C++写的,但是有一些服务器是nodejs的,你可以通过nodejs rtmp这样的协议找到。

视频聊天

延迟是视频聊天最重要的功能,因此您必须将 WebRTC 用于客户端,发布者和播放器。

视频聊天有不同的服务器:

  • 房间服务器,作为与客户端交换 SDP、管理房间和用户、启动某些用户或使麦克风静音等的信令。
  • SFU 服务器(或 MCU),为所有客户端提供媒体流。还有一些SFU,比如JanusmediasoupSRS
  • CDN:很少有CDN支持WebRTC服务器,但QUIC正在发展为WebRTC和HTTP/3的传输,所以未来可能会更好。现在,您可以搜索一些 WebRTC 云服务。

正如我所说,构建 WebRTC 系统非常复杂,所以请反复思考您的场景:您真的需要 WebRTC 系统,还是只需要通过 WebRTC 发布直播流?

如果不确定,请先尝试直播解决方案,它简单而稳定。

【讨论】:

    猜你喜欢
    • 2013-01-08
    • 2018-06-27
    • 1970-01-01
    • 2015-10-28
    • 2020-03-22
    • 2019-06-05
    • 2016-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多