Node.js 服务器上的实时视频流
Posted
技术标签:
【中文标题】Node.js 服务器上的实时视频流【英文标题】:Live Video Stream on a Node.js Server 【发布时间】: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
【问题讨论】:
检查这个:***.com/questions/32347382/… @Profstyle 从我在您发布的 github 链接上看到的用于从视频中捕获单个帧并将其转换为视频?甚至使用 cpp 文件,但也许这只是为了让它与本机相机一起使用,而不仅仅是使用 webrtc 的东西......我真的试图保持这个简单 【参考方案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,比如Janus、mediasoup和SRS。 CDN:很少有CDN支持WebRTC服务器,但QUIC正在发展为WebRTC和HTTP/3的传输,所以未来可能会更好。现在,您可以搜索一些 WebRTC 云服务。正如我所说,构建 WebRTC 系统非常复杂,所以请反复思考您的场景:您真的需要 WebRTC 系统,还是只需要通过 WebRTC 发布直播流?
如果不确定,请先尝试直播解决方案,它简单而稳定。
【讨论】:
以上是关于Node.js 服务器上的实时视频流的主要内容,如果未能解决你的问题,请参考以下文章
来自机器人通过 UDP 发送的图像在服务器 (PC) 上的实时视频流