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


12
ffmpeg -i myvid.mp4  -r  25  -t  100  image-%d.jpeg 

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

提供其他详细信息,

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

另外,我尝试了ffprobe,但是我发现它甚至会不正确地报告视频时长:(


作为什么?AFAIK jpeg没有这样的元数据。EXIF时间戳用于capture时间。
拉吉卜2014年

确保JPEG没有元数据,但mp4可能。我可以指示ffmpeg将其与后来被编码为JPEGS的帧一起拉出并将时间戳记转储到文件中吗?
斯里尼2014年

请包括ffmpeg命令中的完整控制台输出。
llogan 2014年

ffprobe可以为您提供mp4视频流中的时间戳信息。您是在询问是否可能复制或丢弃帧,那么与原始mp4时间戳的对应关系是什么?在那种情况下,我将探索增加详细度设置,以查看是否可以在执行过程中逐帧获取。您能否扩展一下“与帧相关的时间戳”的含义。
dstob

@dstob与帧关联的时间戳是输入视频的呈现时间戳,即相对于视频的开始应显示每个帧的时间。
slhck 2014年

Answers:


13

您可以做的是通过使用过滤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

将输出:

0
0.04
0.08
0.12
0.16
...

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

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.txtframes.txt> combined.txt

将使用以下文件创建文件:

image-0001.jpeg 0
image-0002.jpeg 0.04
image-0003.jpeg 0.08
image-0004.jpeg 0.12

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


这是相对于输出上固定帧速率的时间戳,还是输出的jpeg与原始mp4时间戳的对应关系,可以是任何帧速率和任何时间戳值?
dstob

该时间戳基于请求的输出帧速率。它既涉及输出图片,也涉及这些图片来自的原始输入视频帧,只有一个时基。之所以可以这样做是因为,当更改帧速率时,ffmpeg(当然)不会更快地播放视频,而是“拉伸”每个帧的显示时间,并丢弃不需要的帧。
slhck

手动创建输出时基时,为什么只需要一个时基?当然,情况并非总是如此,但是在我扔给它的前60 fps视频中,ffmpeg只是创建了自己的时基,而忽略了输入的时间戳。
dstob

不知道我确切地知道你在说什么。ffmpeg选择它解析为第一个输入文件的时基的输入时基。您当然也可以用告诉ffmpeg放弃输入时间戳-vsync drop,但这是在过滤IIRC之后发生的。
slhck 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.