最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

使用 NODE.JS 和 html5 实现低延迟(50 毫秒)视频流

网站源码admin19浏览0评论

使用 NODE.JS 和 html5 实现低延迟(50 毫秒)视频流

使用 NODE.JS 和 html5 实现低延迟(50 毫秒)视频流

目标:

我正在构建一个 FPV 机器人,我想通过本地 Wi-Fi 连接使用网络浏览器来控制它。

我使用的是带有 Raspbian Stretch 的树莓派 3B+。我建造了自己的电机控制和电源调节器帽子。

经过大量研究测试,我决定使用node.JS作为http服务器和socket.io来提供与我的机器人的低延迟双向通信。该堆栈实现了大约 7 毫秒的延迟。

问题:

我需要将低延迟视频从连接到 RPI 的 USB 摄像头传输到浏览器。我的目标是在 10FPS 下实现至少 640x480 分辨率,并具有 50 毫秒或更好的延迟。我很高兴牺牲视觉逼真度来获得机器人更快的响应。

如果可能的话我想以UDP方式进行流传输以提高流的可靠性。

如果可能的话,我想传输现代网络浏览器可以本地解码的视频。我想使用 H264 编解码器和 HTML5 视频标签。 如果没有其他选择,我可以回退到使用 javascript 播放器。

我尝试过:

我做了广泛的研究并尝试了很多工具。

除此之外,我尝试了 VLC、mjpg Streamer、gstreamer 和 raspivid。有几次我访问了网络浏览器可以查看的流,但在 320x240 分辨率下最多延迟 700 毫秒。离我的目标还很远。

目前我正在研究 WebRTC 解决方案。

问题:

我想要 NODE.JS 包或其他解决方案的建议,以提供 UDP H264 视频流,该视频流可以由 HTML5 视频标签解码,目标延迟为 50 毫秒。

谢谢

更新:

感谢您的回答!我会不断更新这个问题,一旦解决我会发布解决方案。

推送单个帧

我尝试了一种不同的方法,通过 websocket 推送单个 200KB 640x480 jpg 帧,延迟约为 190 毫秒。通过重用对象,我可能可以做得更好,但我现在暂时搁置这个尝试。

更新2:

在研究 WebRTC 时,我发现了一个看起来很简单的堆栈。 服务器端使用V4L2作为驱动程序,FFMPEG在本地转码为带有TS封装的MPEG1 http流,node js将流翻转为websocket。 客户端有一个 JavaScript 代码可以解码 MPEG1 TS 流并将画布对象绘制到 HTML 页面中。

它实现了 640x480@20FPS,延迟为 240 毫秒。 对于 MVP 来说已经足够好了,但我会继续努力争取它。 答案中的代码。

回答如下:

我从这里改编了代码并将其与http服务器和socket.io控件集成: https://github/phoboslab/jsmpeg

服务器:

V4L2 -> FFMPEG (MPEG1 TS) -> NODE HTTP 服务器 -> NODE Websocket 广播

客户:

Websocket -> Javascript(解码 MPEG1 TS 并绘制到 html 画布)-> Html Canvas

该堆栈实现了 640x480@20FPS,延迟为 240 毫秒。虽然距离我的目标还很远,但作为 MVP 已经足够了。两个方向的控制都有 7ms 的延迟,非常好。

该堆栈受到转码和解码阶段的阻碍,并且 RPI 变得非常热。通过 websocket 传输原始数据看起来不错,我将在未来分析每个步骤的延迟。

执行:

pi@MazeRunner:~ $ node node.js &
pi@MazeRunner:~ $ ffmpeg -f v4l2 -framerate 20 -video_size 640x480 -i /dev/video0 -f mpegts -codec:v mpeg1video -s 640x480 -b:v 600k -bf 0 http://localhost:8080/mystream
发布评论

评论列表(0)

  1. 暂无评论