这段代码对每个场景的第一帧进行截图:
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
它不起作用:(
最佳答案
选择过滤器在处理每一帧时评估表达式的真假。你要相框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
...
其中每个 inpoint 是场景变化列表中两个数据点之间的中值,并且 outpoint 比每个 inpoint 大一帧的持续时间。这里需要一些试验和错误。
关于ffmpeg - 如何使用 FFMPEG 获取每个场景中间的屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34962426/