使用FFmpeg时如何让图片文件名带有时间位置信息

12

我正在使用ffmpeg命令,在每5秒一个截图的方式下,从我的视频中获取一些jpg文件:

ffmpeg -i source -f image2 -r 1/5 %d.jpg

这个方法可以让我得到连续的文件名:

1.jpg
2.jpg
3.jpg
4.jpg

如果我需要知道这些截图的拍摄时间,该怎么办?类似于时间戳的东西:
00:00:00.0000.jpg
00:00:05.0000.jpg
00:00:10.0000.jpg
00:00:15.0000.jpg

或者秒数:

0.jpg
5.jpg
10.jpg
15.jpg

我试着再次使用新的-frame_pts选项:

ffmpeg -i source -f image2 -r 1/5 -frame_pts 1 %d.jpg

我有类似的连续文件名,但现在它们从零开始:

0.jpg
1.jpg
2.jpg
3.jpg

你找到任何解决方案了吗? - BeginnerProgrammer
2个回答

9

使用

ffmpeg -i source -vf fps=1,select='not(mod(t,5))' -vsync 0 -frame_pts 1 z%d.jpg
frame_pts将为图像名称分配一个序列号,其中数字表示输出时间基准的帧位置。因此,计算得出的时间位置为frame # x timebase。时间基准是输出帧速率的倒数,例如对于12 fps流,时间基准是1/12。因此,输出文件image212表示时间为212 x 1/12 = 17.67s
要表示秒,您需要生成一个1 fps的流,并选择每5帧一次,以获取来自每5秒的帧。添加vsync 0可以防止FFmpeg复制帧以生成恒定帧速率流。

9
如果帧率是可变的怎么办?这里的计算假定帧率是恒定的,只需将帧索引除以帧率即可。在假定帧率不是恒定的情况下,是否有一种方法可以获取每帧的实际时间戳? - SomethingSomething
11
可以将时间戳直接指定为文件名吗? - Gerard

0

这可能不是最好的解决方案,但它能够完成任务。

for (i = 0; i < $duration; $i += 0.5) { //where $duration is video duration 
   `ffmpeg -y -i video.mp4 -ss $i -vframes 1 $i.jpg`
}

当然,这样做会非常慢,因为它会为每一帧生成ffmpeg,但正如我所说,这可能有助于您完成工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接