![从视频中每分钟(或每秒)准确提取帧(图像格式)(使用 ffmpeg)](https://linux22.com/image/1456655/%E4%BB%8E%E8%A7%86%E9%A2%91%E4%B8%AD%E6%AF%8F%E5%88%86%E9%92%9F%EF%BC%88%E6%88%96%E6%AF%8F%E7%A7%92%EF%BC%89%E5%87%86%E7%A1%AE%E6%8F%90%E5%8F%96%E5%B8%A7%EF%BC%88%E5%9B%BE%E5%83%8F%E6%A0%BC%E5%BC%8F%EF%BC%89%EF%BC%88%E4%BD%BF%E7%94%A8%20ffmpeg%EF%BC%89.png)
动机:我想寻找框架,然后从视频中截取高质量且精确时间的屏幕截图(图像)。
视频长度为 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"