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)
请注意,如果有太多的帧或太多的信息输出行,这可能会导致多余的行。那里好像有点不准确。