我有一个嵌入式 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
这应该告诉您一些有关视频源的元数据,这对于测试很有用。替换ffprobe
为ffmpeg
进行通常的视频转码:
> 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/fb0
并cat /dev/zero >/dev/fb0