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

AoE*_*ter 6 filenames jpeg screenshot ffmpeg frame

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

ffmpeg -i source -f image2 -r 1/5 %d.jpg
Run Code Online (Sandbox Code Playgroud)

这有效并给我顺序文件名:

1.jpg
2.jpg
3.jpg
4.jpg
Run Code Online (Sandbox Code Playgroud)

如果我需要知道这些屏幕截图是在什么时间拍摄的怎么办?类似时间戳的东西:

00:00:00.0000.jpg
00:00:05.0000.jpg
00:00:10.0000.jpg
00:00:15.0000.jpg
Run Code Online (Sandbox Code Playgroud)

或秒数:

0.jpg
5.jpg
10.jpg
15.jpg
Run Code Online (Sandbox Code Playgroud)

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

ffmpeg -i source -f image2 -r 1/5 -frame_pts 1 %d.jpg
Run Code Online (Sandbox Code Playgroud)

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

0.jpg
1.jpg
2.jpg
3.jpg
Run Code Online (Sandbox Code Playgroud)

Gya*_*yan 6

ffmpeg -i source -vf fps=1,select='not(mod(t,5))' -vsync 0 -frame_pts 1 z%d.jpg
Run Code Online (Sandbox Code Playgroud)

frame_pts 将为图像名称分配一个序列号,其中数字表示根据输出时基的帧位置。所以计算出的时间位置是frame #x timebase。时基是输出帧率的倒数,例如对于 12 fps 流,时基是 1/12。所以输出文件image212代表一个时间212x 1/12=17.67s

要表示秒,您需要生成一个 1 fps 的流,然后每 5 帧选取一次,以每 5 秒获取一个帧。将vsync 0 被添加到防止FFMPEG从复制帧,以产生恒定的帧速率的流。

  • 如果帧率是可变的怎么办?这里的计算假设帧速率是恒定的,并且简单地将帧索引除以帧速率。假设帧速率不是恒定的,有没有办法获得每帧的实际时间戳? (6认同)
  • 是否可以只将时间戳指定为文件名? (4认同)