2017-08-14 215 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