我目前正在使用以下命令转储 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 帧,这表明它正在处理和保存每一帧。
- 定位关键帧是否真的有效,或者任何帧(例如每秒)都可以吗?
- 是否可以将帧连续保存为相同的文件名,或者我必须编写一些外部脚本来清理旧帧?
- 有什么原因为什么
-skip_frame nokey
不起作用?注意:我也试过-discard
- 是否可以使用 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 是无用的。