ffmpeg:从视频中提取图像及其帧号?

时间:2017-08-14 17:31:31

标签: ffmpeg

我正在使用

从(可变帧速率).avi文件中提取图像
ffmpeg -i movie.avi -r 25 %05d.png

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

2 个答案:

答案 0 :(得分: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 31F8CE68]平均值:[76 111 155] stdev:[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以提取原始视频中帧位置的额外步骤/ p>

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]

答案 1 :(得分:0)

如果您使用

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

不会复制或删除任何帧,因此每个帧序列号都没有。应与视频中的索引相对应。