ffmpeg - 如何使用 FFMPEG 获取每个场景中间的屏幕截图

标签 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

它不起作用:(

最佳答案

选择过滤器在处理每一帧时评估表达式的真假。你要相框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/

相关文章:

ffmpeg - 无法使用 ffmpeg 包将双鱼眼图像转换为等距柱状图像

c# - 在 using 指令 ​​ "using Accord.Video.FFMPEG"中,命名空间中不存在 FFMPEG

ffmpeg - 如何使用 ffmpeg 从网络摄像头获取未解码的 h264 流?

go - 如何使用命令行在 linux 中使用 ffmpeg 将两个 wav 拼接在一起?

audio - 使用 FFmpeg(或 sox)减少立体声

linux - 接收 rtsp 流时 FFMPEG 错误

ffmpeg - 如何使用 FFMPEG 将 mp4 转换为 h264 添加 AUD

ffmpeg - 如何在 C 中解码来自这个无名的几乎 UVC 灰度相机的流

video - 相机的pts和dts跳转问题

ffmpeg - 未知编码器 libvo_aacenc