如何通过 http 将 Linux 帧缓冲区作为视频进行流式传输

如何通过 http 将 Linux 帧缓冲区作为视频进行流式传输

我有一个嵌入式 Linux 系统(基于 yocto),带有帧缓冲区 UI(无 X11)和正在运行的 Web 服务器。

现在我问如何将屏幕内容“镜像”到网页。把它想象成一个网络摄像头,只不过流不是来自摄像头,而是来自/dev/fb0.

听起来是一件很明显的事情,但我的网络搜索没有抛出任何匹配项。您知道如何进行吗?

答案1

Linux 帧缓冲视频可通过 ffmpeg 获取fbdev设备。

> ffprobe -f fbdev -i '/dev/fb0'                                                                           
[fbdev @ 0x2308100] w:1920 h:1080 bpp:32 pixfmt:bgra fps:25/1 bit_rate:1658880000
[fbdev @ 0x2308100] Stream #0: not enough frames to estimate rate; consider increasing probesize
Input #0, fbdev, from '/dev/fb0':
  Duration: N/A, start: 1673953008.518392, bitrate: 1658880 kb/s
  Stream #0:0: Video: rawvideo (BGRA / 0x41524742), bgra, 1920x1080, 1658880 kb/s, 25 fps, 1000k tbr, 1000k tbn

这应该告诉您一些有关视频源的元数据,这对于测试很有用。替换ffprobeffmpeg进行通常的视频转码:

> ffmpeg -f fbdev -i '/dev/fb0' -f matroska -crf 0 -filter:v 'scale=-1:720' - | mpv

这会将编码的视频流发送到,该视频流应该在缓冲几秒钟后stdout播放。mpv如果您的无头服务器可以通过 SSH 访问,您可以重用此管道技术并执行以下操作:

ssh server ffmpeg -f fbdev -i '/dev/fb0' -f matroska -crf 0 -filter:v 'scale=-1:720' - | mpv

这必须从安装了 GUI 和视频播放器(mpv在上面的示例中)且具有 SSH 访问权限的计算机上运行server。或者,视频流可以通过 HTTP 公开。看着回答,例如,你可以这样做:

ffmpeg -f fbdev -i '/dev/fb0' -f mp4 -movflags frag_keyframe+empty_moov -listen 1 http://localhost:8080/

这使得 ffmpeg 成为一次性网络服务器,您可以将您最喜欢的视频播放器指向,例如vlc http://localhost:8080/.您的浏览器可能会坚持下载该文件,这可能需要将 URL 封装在某些 HTML 中。

制作一个合适的流媒体网络服务器是一个更大的主题,如果您打算拥有许多访问者并支持各种设备,则可能很难做好。主题好像是回答了 多种的 ,但对于其他视频源。

我希望这能让您朝着正确的方向迈出一步。

注意:如果您想在测试时弄乱帧缓冲区内容,您可以发出cat /dev/urandom >/dev/fb0cat /dev/zero >/dev/fb0

相关内容