ffmpeg录制的同时观看多流视频文件
Posted
技术标签:
【中文标题】ffmpeg录制的同时观看多流视频文件【英文标题】:Watch multi-stream video file while being recorded by ffmpeg 【发布时间】:2020-01-18 08:23:40 【问题描述】:我正在使用 ffmpeg 同时录制四个 1080p 视频流,我想在录制时实时查看这些流。理想情况下,我想从一台单独的机器上查看它们,使用一些方便的 Linux 数据共享方法,如 ssh/sshfs/...,但这是一个不错的选择。有没有实用的方法来做到这一点?
我目前使用的ffmpeg录制命令是这样的:
ffmpeg \
-f v4l2 -i $cam0 \
-f v4l2 -i $cam1 \
-f v4l2 -i $cam2 \
-f v4l2 -i $cam3 \
-f matroska \
-map 0 \
-map 1 \
-map 2 \
-map 3 \
-c copy \
$output.mkv
如果我可以使用ffplay
或vlc
之类的命令来播放一个或多个视频流,始终跟踪接近流的末尾,当数据可用时播放更多视频,我的问题将得到解决。不过我还没有找到这样的选择。
另一种方法可能是让录制 ffmpeg 进程也将四个 1080p 视频平铺到一个 4K 网格中,然后通过管道传输到 ffplay。然后我至少可以在正在录制的同一台机器上预览。不过,我无法制定出正确的 ffmpeg 命令来进行平铺,希望能举个例子。
【问题讨论】:
不适用于 MKV 输出。 那么用不同的输出怎么样?如果有帮助的话,我什至愿意运行多个单独的 ffmpeg 进程。 【参考方案1】:这可以通过 TS 容器输出来完成。
ffmpeg \
-f v4l2 -i $cam0 \
-f v4l2 -i $cam1 \
-f v4l2 -i $cam2 \
-f v4l2 -i $cam3 \
-f mpegts \
-map 0 \
-map 1 \
-map 2 \
-map 3 \
-c copy \
$output.ts
对于监控,
ffmpeg -sseof -3 -i $output.ts -map 0:v:0 -f sdl2 -
这将尝试根据 ffmpeg 解析文件时记录的持续时间从文件末尾查找 3 秒,并显示第一个流。预计播放前会有一些延迟,因为 ffmpeg 等待关键帧。
要合并所有四个流,您需要添加堆栈过滤器,例如 xstack。
【讨论】:
谢谢。我的反馈很慢,因为我正在努力让它发挥作用。第一个 ffmpeg sdl 输出不会播放我的视频,我用“-pix_fmt yuv420p”修复了这个问题,现在的问题是播放速度太快(> 3x),它很快就会到达文件末尾并出现错误。所以我试图强制 sdl2 播放以 60fps 的速度运行,就像输入(USB 视频采集卡)一样。以上是关于ffmpeg录制的同时观看多流视频文件的主要内容,如果未能解决你的问题,请参考以下文章