2016-01-23 70 views
0

該代碼使得每個場景的第一幀的屏幕截圖,每個場景的中間的屏幕截圖:如何獲得使用FFMPEG

ffmpeg -i video.mp4 -vsync 0 -vf select='gt(scene\,0.4)' -f image2 img-%04d.png 

如何獲得每個場景的中間的截圖?

例如:開始場景 - 1:25;結束場景 - 1:31。如何獲得1:28的屏幕截圖?

我嘗試這樣做:

ffmpeg -i video.mp4 -vsync 0 -vf select='(prev_selected_t*gt(scene\,0.4)+t*gt(scene\,0.4))/2' -f image2 img-%04d.png 

它不工作:(

回答

2

選擇篩選評估爲真或假的表達,因爲它處理每一幀你想幀n,中心框架。當ffmpeg正在處理幀n時,它不知道場景何時結束 您的過濾器如寫入的那樣根據條件選擇場景變化幀

相反,您需要執行一次生成場景更改時間戳列表,然後使用選擇過濾器提取中間幀。

對於第一部分,從here

ffprobe -show_frames -of compact=p=0 -f lavfi 
"movie=$F,select=gt(scene\,.4)" | gsed -r 
's/.*pkt_pts_time=([0-9.]{8,})\|.*/\1/' >> scenes-0.4 

然後,

ffmpeg -vsync 0 -f concat -i list.text -vf select=concatdec_select img-%04d.png 

其中LIST.TXT是

file 'video.mp4' 
inpoint 23.342 
outpoint 23.372 
file 'video.mp4' 
inpoint 57.031 
outpoint 57.064 
... 

,其中每個內點是兩者之間的中間值數據點在場景變化列表中,並且outpoint大於每個inpoint的un un一幀的持續時間。這裏需要一些試驗和錯誤。