从视频中每分钟(或每秒)准确提取帧(图像格式)(使用 ffmpeg)

从视频中每分钟(或每秒)准确提取帧(图像格式)(使用 ffmpeg)

动机:我想寻找框架,然后从视频中截取高质量且精确时间的屏幕截图(图像)。

视频长度为 00:48:43.71,帧率为 23.98 fps(我们可以认为它是 24 fps,不是吗?)。


参考此网页:每隔 X 秒创建一个视频缩略图

我编写了一些命令,每小时、每分钟、每秒抓取一帧。

删除图片后,截图实际上是从一半小时,一半分钟,一半第二。你很快就会明白。

例如,每分钟抓取一帧​​的命令,其实就是提取帧半分钟后,这意味着 00:00:30 、 00:01:30 、 00:02:30 等等。这就是为什么我将文件名命名为:

ffmpeg -i "video.mp4" -start_number 0 -vf fps=1/60 "B 00-%02d-30.000.png"

(添加“B”前缀是为了防止被不同的命令覆盖。)

例如,从 00:03:00 到 00:04:00 每秒抓取一帧,命令为:

ffmpeg -i "video.mp4" -start_number 0 -vf fps=1 -ss 00:03:00 -to 00:04:00 "C 00-03-%02d.500.png"

为了验证它们,我们可以提取从 00:03:29 到 00:03:31 的所有帧:

ffmpeg -copyts -ss 00:03:29 -i "video.mp4" -start_number 0 -to 00:03:31 "D 00-03-29.%03d.png"

我们可以检查以下图像文件是否相同:

D 00:03:29.012.png与 相同C 00:03:29.500.png

D 00:03:29.024.png与 相同B 00:03:30.000.png

D 00:03:29.036.png与 相同C 00:03:30.500.png


以上就是我今天早上反复试验的结果。我的问题如下:

让我们以“每分钟提取一帧”为例,我们如何获取/获取帧 00:00:00.000、00:00:01.000、00:00:02.000 等的命令是什么?

我今天早上才听说ffmpeg。我仍然不知道是什么-copyts意思(读完文档)以及什么时候需要放在-ss position前面-i,什么时候放在输出部分。所以请请纠正我如果我使用了错误的命令。

答案1

fps 过滤器旨在根据输入 fps 智能地删除/复制帧以匹配输出 fps。如果您要求它每分钟输出一帧,它将选择 00:00-01:00 窗口中心的一帧并删除所有其他帧,因此您会在 00:30、01:30 等处获得帧。

您是否考虑过制作一个执行此操作的 bat/bash 脚本?

for i in 0..50
   ffmpeg -ss %i:oo -i input.mp4 -vframes 1 out-%i.png

如果您希望获取 01:00、02:00 [..] 而不是 00:30、01:30 [..] 的屏幕截图,您还可以执行以下操作:

ffmpeg -ss 00:30 -i input.mp4 -start_number 0 -vf fps=1/60 "B 00-%02d-00.000.png"

相关内容