2017-08-14 200 views
1

我提取(可变帧率)图像的.avi文件与ffmpeg:从视频中提取图像及其帧数?

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

(该-r选项应该是相当于过滤-vf='fps=fps=25'),但现在想知道的原始视频帧数流每个生成的图像对应。有没有简单的方法来做到这一点?

回答

0

如果使用

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

无框架将被复制或删除,因此每个帧序列号。应该与视频中的索引相对应。

+0

是,但我想被提取的那些帧的帧号码,如果我指定“-r 25 “ 选项。 – BlenderBender

0

我发现一些做我想做的事情,这不是一件容易的事情。随着“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] mean:[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提取帧的位置在原始视频,如果你不是运行

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

您也可以在fps过滤器之前插入showinfo。如果fps下降一些帧,那么他们的信息将永远不会显示在后fps。然后将不得不检查数据包大小,以查看位置系列中是否存在空白。 – Mulvya

+0

如果您执行两次提取 - 您的和我的 - 然后您可以按顺序比较一系列文件大小以识别丢弃和重复。 – Mulvya

+0

fps *的目的是*丢帧,达到给定的帧率。我不明白你在说什么。 – BlenderBender