如何使用 -r 选项从视频中提取与 ffmpeg 提取的帧相关的时间戳?

Sri*_*ini 13 ffmpeg libav

ffmpeg -i myvid.mp4  -r  25  -t  100  image-%d.jpeg 
Run Code Online (Sandbox Code Playgroud)

是我用来提取帧的命令,它的工作方式与我预期的一样。但是,我还想查看帧的时间戳。以任何精度。100 毫秒对我来说已经足够了。ffmpeg 可以做到这一点吗?

提供额外的细节,

当我运行上面的命令时,我得到了大约 100 个 JPEG,我猜这些 JPEG 和视频帧之间存在 1 对 1(或多对 1)的对应关系。我想知道作为 JPEG 图像“i”输出的帧的时间戳。

此外,我尝试了 ffprobe,但我发现它甚至不准确地报告了视频持续时间:(

slh*_*hck 16

您可以做的是通过使用过滤fps器过滤来“模拟”图像写入过程,然后使用ffprobe来显示生成帧的时间戳。这意味着在 25 fps 时,第 50 帧(如您的第 50 张图像)的 PTS 为 2.00 秒。

你这样做:

ffprobe -f lavfi -i "movie=input.mp4,fps=fps=25[out0]" -show_frames -show_entries frame=pkt_pts_time -of csv=p=0
Run Code Online (Sandbox Code Playgroud)

将输出:

0
0.04
0.08
0.12
0.16
...
Run Code Online (Sandbox Code Playgroud)

这些是每个输出图像的时间戳。您实际上可以组合帧列表和时间戳:

ls -1 image-*.jpeg > images.txt
ffprobe -f lavfi -i "movie=input.mp4,fps=fps=25[out0]" -show_frames -show_entries frame=pkt_pts_time -of csv=p=0 > frames.txt
粘贴images.txt frames.txt > combine.txt

将创建一个文件:

image-0001.jpeg 0
image-0002.jpeg 0.04
image-0003.jpeg 0.08
image-0004.jpeg 0.12
Run Code Online (Sandbox Code Playgroud)

请注意,如果有太多的帧或太多的信息输出行,这可能会导致多余的行。那里好像有点不准确。