FFmpeg 命令查找最接近第 3 分钟的关键帧

FFmpeg 命令查找最接近第 3 分钟的关键帧

我使用 FFmpeg 在第 3 分钟提取一个关键帧。这意味着它是第 3*60*25 帧(假设 25 FPS)。现在,通常这个帧是不是一个关键帧。

我想提取最接近上述帧的帧,但要确保它是关键帧。这意味着该帧可能出现在视频第三分钟之前或之后几秒。

我到处都找过了,但毫无收获!我在 Linux 上做这个,所以如果你使用 FFmpeg 并安装或捆绑了某些东西,请告诉我!

答案1

使用-ss带有过滤器的参数select可以起作用。

类似于:

ffmpeg -ss 180 -i yourvideo.mp4 -vf select="eq(pict_type\,I)" -vframes 1 thumbnails.jpeg

答案2

如果你假设最接近 00:03:00 的 I 帧出现时间戳,您必须进行一些猜测,因为每个视频的 GOP 长度(每个 I 帧之间的帧数)并不相同。如果您知道 GOP 长度,例如 125 帧,则从该时间之前 5 秒开始,例如 00:02:55。

注意,这不一定是固定长度。好的编码器会将 I 帧放置在场景切换处而不是固定点,以实现更好的压缩和可靠性。

因此,让我们使用 将输入按之前计算的时间量进行移动-itsoffset

我们指定select过滤器只获取 I 帧,并且-vframes只接收一帧。最后,将其写入文件.jpg

ffmpeg -itsoffset -00:02:55 -i in.mp4 -filter:v select='eq(pict_type\,I)' -vframes 1 out.jpg

我用一个视频测试了这一点,该视频最初在 00:03:00 有一个 P 帧,之后我收到了第 13 帧,这是一个新场景的开始 - I 帧。

相关内容