ffmpeg输出图像文件名的时间位置

时间:2018-04-30 11:45:36

标签: ffmpeg jpeg screenshot filenames frame

我正在使用ffmpeg以特定的速率从我的视频中获取一些jpg(每5秒一个屏幕截图):

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

2 个答案:

答案 0 :(得分:4)

使用

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重复帧以生成恒定的帧速率流。

答案 1 :(得分: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,但是正如我所说的那样,它可以帮助您完成工作。