检测部分帧的场景变化

Detect scene change on part of the frame

我有一个在线讲座的视频文件,由幻灯片和背景音频组成。
我想保存每张幻灯片的图像以及该幻灯片的时间戳。 我使用场景和元数据过滤器执行此操作:

ffmpeg -i week-01.mp4 -filter_complex "select='gt(scene,0.011)',metadata=print:file=frames/time.txt" -vsync vfr frames/img%03d.jpg

这工作正常,除了一件事,视频文件右侧的屏幕上有一个计时器。 如果我将 thershold 设置得足够小以获取所有幻灯片更改,它也会获取计时器更改。

所以这是我的问题,我可以问 ffmpeg 到:

  1. 对帧的一部分进行分析(仅右侧直到左侧大约 75%)。
  2. 然后,在检测到该区域的场景变化时,保存整个帧和时间戳。

我想制作一个脚本

  1. 裁剪视频并将其与原始视频一起保存
  2. 针对场景变化分析裁剪视频并保存时间戳
  3. 使用时间戳从原始视频中提取帧

是否有 better/faster/shorter 方法来做到这一点? 提前致谢!

您可以像这样用一条命令完成,

ffmpeg -i week-01.mp4 -filter_complex "[0]split=2[full][no_timer];[no_timer]drawbox=w=0.25*iw:h=ih:x=0.75*iw:y=0[no_timer];[no_timer]select='gt(scene,0.011)',metadata=print:file=frames/time.txt[no_timer];[no_timer][full]overlay" -vsync vfr frames/img%03d.jpg

基本上,制作两个视频副本,在一个副本上使用drawbox将右侧四分之一的屏幕涂成纯黑色,分析场景变化并将分数记录到文件中;然后将未上漆的完整框架覆盖在已上漆的框架之上。由于叠加同步帧的方式,只有具有相应时间戳的完整帧将用于叠加在基本选定帧之上。