保留 RTSP 流中的单个最新关键帧

保留 RTSP 流中的单个最新关键帧

我目前正在使用以下命令转储 RTSP 流:

ffmpeg -hide_banner -loglevel error -i $RTSP_CAMERA -vcodec copy -t $LENGTH -y $FILENAME.mp4

我每 $LENGTH 秒运行一次,以获取一系列转储文件。流以 7fps 运行,GOP/i/keyframe 设置为 7(因此每秒一个新的关键帧)。

我现在需要在任意时间提供最近的帧。为了最高效,我的想法是从流中保留最新的一两个关键帧(如上所述,每秒 1 个)。我的第一个尝试是使用:

ffmpeg -skip_frame nokey -i $RTSP_CAMERA -f image2 $FILENAME.jpeg

然而,这抱怨 $FILENAME 没有模板化。添加 %02d 解决了这个问题,但设计导致帧集合不断增加,文件名不断变化。此外,我每秒保存 7 帧,这表明它正在处理和保存每一帧。

  1. 定位关键帧是否真的有效,或者任何帧(例如每秒)都可以吗?
  2. 是否可以将帧连续保存为相同的文件名,或者我必须编写一些外部脚本来清理旧帧?
  3. 有什么原因为什么-skip_frame nokey不起作用?注意:我也试过-discard
  4. 是否可以使用 ffmpeg 调用来转储 rtsp 流以保存关键帧?

答案1

image2被配置为恒定帧速率多路复用器,因此当提供的帧数小于帧速率时,它将尝试维持流帧速率。-vsync 0可以避免这种情况。image2 有一个-update将新图像写入同一个文件的选项。

因此,使用

ffmpeg -skip_frame nokey -i $RTSP_CAMERA -vsync 0 -f image2 -update 1 $FILENAME.jpeg

顺便说一句,如果你的源编解码器是运动 jpeg,那么所有帧都是关键帧,而 skip_frame 是无用的。

相关内容