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

如果我可以使用ffplayvlc 之类的命令来播放一个或多个视频流,始终跟踪接近流的末尾,当数据可用时播放更多视频,我的问题将得到解决。不过我还没有找到这样的选择。

另一种方法可能是让录制 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录制的同时观看多流视频文件的主要内容,如果未能解决你的问题,请参考以下文章

观看视频时录制带音频的视频

如何用ffmpeg将rtsp视频流录制成mp4文件?

使用java执行ffmpeg命令进行推流操作

ffmpeg使用filter crop 裁剪视频

基于FFmpeg的视频播放器之十五:录像

ffmpeg命令 从网络摄像头录制视频