2014-06-26 74 views
3

我使用ffmpeg從視頻中每隔五分鐘提取一幀(作爲jpeg),並按順序將輸出從控制檯傳輸到文本文件以獲取提取的幀的確切時間戳。使用ffmpeg從視頻中提取多個圖像並獲取提取圖像的時間戳

我使用的命令是:

ffmpeg -i input.avi -ss 00:10:00 -vframes 10 -vf showinfo,fps=fps=1/300 %03d.jpg &> output.txt 

-ss 00:10:00讓我開始前跳到10分鐘在視頻和-vframes 10讓我只捕獲第一10幀(每5分鐘1幀) 。

這幾乎可以正常工作,只是命令輸出所有幀的信息,包括那些沒有寫成JPEG格式的信息。這裏是一個三線輸出樣本:

[Parsed_showinfo_0 @ 0x2219020] n:11427 pts:11429 pts_time:599.979 pos:48892180 fmt:yuv420p sar:1/1 s:640x480 i:P iskey:0 type:P checksum:6309A75D plane_checksum:[15A29007 1617E1FE D93A3549] mean:[146 125 153 ] stdev:[17.6 1.0 2.1 ] 
[Parsed_showinfo_0 @ 0x2219020] n:11428 pts:11430 pts_time:600.031 pos:48898094 fmt:yuv420p sar:1/1 s:640x480 i:P iskey:0 type:B checksum:815D031A plane_checksum:[E004E973 E28CE2D5 F56636B4] mean:[146 125 153 ] stdev:[17.6 1.0 2.1 ] 
[Parsed_showinfo_0 @ 0x2219020] n:11429 pts:11431 pts_time:600.084 pos:48892448 fmt:yuv420p sar:1/1 s:640x480 i:P iskey:0 type:P checksum:6CE2D3C5 plane_checksum:[E983BD86 38B9E198 93B13498] mean:[146 125 153 ] stdev:[17.6 1.0 2.1 ] 

我期望中間線,與pts_time:600.031,要被提取作爲圖像的第一幀,但沒有辦法從其它幀任一側上,其中,圖像區分它沒有被提取。

有沒有人知道一種方法來解決這個問題?

謝謝!

回答

0

在回答我自己的問題時,我已經找到了一種解決方法,但我並不確定它是如何工作的。由內-vf限定select參數並且還加入了vsync 0參數,如下所示:

ffmpeg -i input.avi -vframes 10 -vf '[in]select=not(mod(n\,300*19.05))[s1];[s1]showinfo[out]' -vsync 0 %02d.jpg >& output.txt 

...的功能現在只有所需的10幀返回。這是第一個兩幀的樣本stderr輸出:

[Parsed_showinfo_1 @ 0x21b1b60] n:0 pts:2 pts_time:0.104992 pos:10248 fmt:yuv420p sar:1/1 s:640x480 i:P iskey:1 type:I checksum:F6FDCFBF plane_checksum:[5FB6331C 9D9D7F99 44FB1D0A] mean:[183 126 155 ] stdev:[19.6 0.8 2.8 ] 
frame= 1 fps=0.0 q=4.1 size=N/A time=00:00:00.15 bitrate=N/A  
frame= 1 fps=1.0 q=4.1 size=N/A time=00:00:00.15 bitrate=N/A  
frame= 1 fps=0.7 q=4.1 size=N/A time=00:00:00.15 bitrate=N/A  
frame= 1 fps=0.5 q=4.1 size=N/A time=00:00:00.15 bitrate=N/A  
frame= 1 fps=0.4 q=4.1 size=N/A time=00:00:00.15 bitrate=N/A  
frame= 1 fps=0.3 q=4.1 size=N/A time=00:00:00.15 bitrate=N/A  
frame= 1 fps=0.3 q=4.1 size=N/A time=00:00:00.15 bitrate=N/A  
frame= 1 fps=0.2 q=4.1 size=N/A time=00:00:00.15 bitrate=N/A  
frame= 1 fps=0.2 q=4.1 size=N/A time=00:00:00.15 bitrate=N/A  
[Parsed_showinfo_1 @ 0x21b1b60] n:1 pts:5717 pts_time:300.121 pos:24474150 fmt:yuv420p sar:1/1 s:640x480 i:P iskey:0 type:P checksum:BAECD030 plane_checksum:[F609470E 45F694CE 4BFCF445] mean:[148 126 152 ] stdev:[17.7 0.8 2.3 ] 
frame= 2 fps=0.4 q=2.1 size=N/A time=00:05:00.17 bitrate=N/A  
frame= 2 fps=0.4 q=2.1 size=N/A time=00:05:00.17 bitrate=N/A  
frame= 2 fps=0.3 q=2.1 size=N/A time=00:05:00.17 bitrate=N/A  
frame= 2 fps=0.3 q=2.1 size=N/A time=00:05:00.17 bitrate=N/A  
frame= 2 fps=0.3 q=2.1 size=N/A time=00:05:00.17 bitrate=N/A  
frame= 2 fps=0.3 q=2.1 size=N/A time=00:05:00.17 bitrate=N/A  
frame= 2 fps=0.2 q=2.1 size=N/A time=00:05:00.17 bitrate=N/A  
frame= 2 fps=0.2 q=2.1 size=N/A time=00:05:00.17 bitrate=N/A  
frame= 2 fps=0.2 q=2.1 size=N/A time=00:05:00.17 bitrate=N/A 

仍然不確定究竟爲什麼這個工程或爲什麼每個frame= ...在輸出重複這麼多次,但似乎做的工作!

0

此外,從「-ss」參數的ffmpeg的文檔:

當作爲(前-I)的輸入選項一起使用,尋求在該輸入文件到位置。請注意,在大多數格式中,無法準確查找,因此ffm​​peg會在位置前尋找最近的搜索點。

因此,應該返回的幀是n:11427處的幀。

0

您可以使用-vf showinfo獲取使用ffmpeg的幀信息。例如,當場景改變時提取幀並獲得該特定幀的時間戳。

ffmpeg -i image.mp4 -filter:v "select='gt(scene,0.1)',showinfo" -vsync 0 frames%05d.jpg >& output.txt 

你會輸出類似像:[Parsed_showinfo_1 @ 0x25bf900] N:0分:119357 pts_time:9.95637 ....我們感興趣的部分是pts_time,獲取時間使用以下命令:

grep showinfo ffout | grep pts_time:[0-9.]* -o | grep '[0-9]*\.[0-9]*' -o > timestamps 

你會得到類似的輸出:

9.95637 
9.98974 
15.0281 
21.8016 
28.208 
28.4082 
28.5083 
+0

這裏ffout是output.txt –