2016-01-23 67 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一帧的持续时间。这里需要一些试验和错误。