【问题标题】:Detect scene change on part of the frame检测部分帧的场景变化
【发布时间】:2021-09-01 03:36:11
【问题描述】:

我有一个在线讲座的视频文件,其中包含幻灯片和背景音频。
我想保存每张幻灯片的图像以及该幻灯片的时间戳。 我使用场景和元数据过滤器来做到这一点:

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

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

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

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

我想制作一个脚本

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

有没有更好/更快/更短的方法来做到这一点? 提前致谢!

【问题讨论】:

    标签: ffmpeg crop scene


    【解决方案1】:

    你可以像这样在一个命令中完成它,

    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在右侧四分之一屏幕上绘制纯黑色,分析场景变化并将分数记录到文件中;然后将完整的未上漆框架覆盖在已上漆的框架之上。由于覆盖同步帧的方式,只有具有相应时间戳的完整帧将用于覆盖在基本选定帧之上。

    【讨论】:

    • 我觉得这可能是正确的答案,或者至少是正确的答案。问题是运行此命令会稳步增加我的 ram 使用量,直到达到最大 4GB 时自动终止该进程。 ram 的使用似乎只在场景之间像这样上升。如果我降低场景阈值,命令运行没有问题,当然,它检测到太多场景。
    • 这听起来像是资源限制,而不是命令。确保您使用的是最新的 ffmpeg 4.3 或更高版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    相关资源
    最近更新 更多