【问题标题】:ffmpeg: extracting images from video together with their frame numbers?ffmpeg:从视频中提取图像及其帧号?
【发布时间】:2018-02-22 23:56:08
【问题描述】:

我正在从(可变帧率).avi 文件中提取图像

ffmpeg -i movie.avi -r 25 %05d.png

-roption 应该等效于过滤器-vf='fps=fps=25'),但现在想知道每个生成的图像对应的原始视频流中的帧号。有没有简单的方法可以做到这一点?

【问题讨论】:

    标签: ffmpeg


    【解决方案1】:

    我找到了一些方法来做我想做的事,这并不容易。使用“showinfo”过滤器,可以获得帧相对于源文件的位置,即运行

    ffmpeg -i movie.avi -filter:v 'showinfo' output.avi
    

    举个例子

    [Parsed_showinfo_1 @ 0x7ffaebd01bc0] n: 0 pts: 0 pts_time:0 pos: 630548 fmt:yuv420p sar:1/1 s:1280x720 i:P iskey:0 type:P checksum:B4E5E664 plane_checksum:[6B3569DD 72B2AE10 3F]平均值:[76 111 155] 标准差:[13.1 3.8 8.7]

    其中“pos: 630548”是源文件中第一帧的位置。给定源文件中哪个位置对应于哪个帧的信息,然后可以这样做

    ffmpeg -i movie.avi -filter:v "fps=fps=25, showinfo" %05d.png > output.txt 2>&1
    

    它像以前一样提取图像,但也给出了输入文件中提取的帧的位置,从这两个信息中可以拼凑出从提取的帧到输入文件中的帧的映射。

    但是,我不认为这个解决方案可以被称为“简单”(或漂亮)。

    编辑:根据@Mulvya 的建议,如果您改为运行,则可以省去运行ffmpeg -i movie.avi -filter:v 'showinfo' output.avi 提取原始视频中帧位置的额外步骤

    ffmpeg -i movie.avi -filter:v "showinfo, fps=fps=25, showinfo" %05d.png > output.txt 2>&1
    

    这将同时发出原始视频流和过滤后的视频流的 showinfo,例如(原始视频流对应Parsed_showinfo_0开头的行,过滤后的流对应Parsed_showinfo_2开头的行)

    [Parsed_showinfo_0 @ 00a38820] n:   0 pts:      0 pts_time:0       pos:      508 fmt:pal8 sar:0/1 s:320x200 i:P iskey:1 type:I checksum:CF3AE73F plane_checksum:[CF3AE73F] mean:[117] stdev:[48.3]
    [Parsed_showinfo_0 @ 00a38820] n:   1 pts:      1 pts_time:0.0285362 pos:    26710 fmt:pal8 sar:0/1 s:320x200 i:P iskey:0 type:P checksum:CF3AE73F plane_checksum:[CF3AE73F] mean:[117] stdev:[48.3]
    [Parsed_showinfo_2 @ 00a38ca0] n:   0 pts:      0 pts_time:0       pos:      508 fmt:pal8 sar:0/1 s:320x200 i:P iskey:1 type:I checksum:CF3AE73F plane_checksum:[CF3AE73F] mean:[117] stdev:[48.3]
    [Parsed_showinfo_0 @ 00a38820] n:   2 pts:      2 pts_time:0.0570725 pos:    31680 fmt:pal8 sar:0/1 s:320x200 i:P iskey:0 type:P checksum:512EEB5E plane_checksum:[512EEB5E] mean:[117] stdev:[48.2]
    

    【讨论】:

    • 您可能还想在 fps 过滤器之前插入一个 showinfo。如果 fps 丢了一些帧,那么他们的信息将永远不会显示在 fps 后。然后必须检查数据包大小以查看位置序列中是否存在间隙。
    • 如果您执行两次提取 - 您的和我的 - 然后您可以按顺序比较一系列文件大小以识别丢失和重复。
    • fps的目的是丢帧,达到给定的帧率。我不明白你在说什么。
    • 现在我明白你在说什么了(我想):使用-filter:v "showinfo, fps=fps=25, showinfo 会在使用 fps 过滤器之后的 之前发出 showinfo 输出,彼此交错。因此,您为自己节省了一次 ffmpeg 的执行。
    【解决方案2】:

    如果你使用

    ffmpeg -i movie.avi -vsync 0 %05d.png
    

    不会复制或丢弃任何帧,因此每个帧的序列号。应该与它在视频中的索引相对应。

    【讨论】:

    • 是的,但是如果我指定“-r 25”选项,我想要提取的那些帧的帧号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多