V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
jifengg
V2EX  ›  分享创造

使用 ffmpeg 分析视频场景帧,并生成播放器支持的书签文件,支持 PotPlayer

  •  
  •   jifengg · 14 天前 · 812 次点击

    前几天看 v 站有位 v 友发了个帖子《有沒有視頻產生縮略圖並記錄時間點的軟件》/t/1034649。 当时有兴趣就研究了一下。

    不得不说 ffmpeg 本身真是强大,经过几天研究,有了一些心得和产出。

    先给出 GitHub 地址:https://github.com/jifengg/ffmpeg-script

    使用方式:

    node ffmpeg.video2bookmark.js -i <file|folder> [-temp <folder> ...]
    

    支持的参数:

    -i              <string>    [必须]要处理的文件或目录
    -y                          是否覆盖已经存在的 pbf 文件,默认:false
    -size           <number>    缩略图高度,默认:72
    -score          <number>    0.0 到 1.0 之间的值,表示视频帧可能为新场景的概率;建议设置在 0.3 到 0.5 之间。太小的值会出现过多场景帧,而太大的值会导致过少的场景帧。默认:0.5
    -temp           <string>    缓存目录,默认为脚本所在目录下的“temp”目录
    -min-interval   <number>    两个场景帧之间的最小间隔,间隔比这个值小的场景帧将被丢弃,这个值保证书签不会太密集,单位秒,默认:20.0
    -max-interval   <number>    两个场景帧之间的最大间隔,如果间隔比这个值大,将在他们之间每 max-interval 秒取一帧,这个值保证书签不会太稀疏,单位秒,默认:60.0
    -h                          显示这个帮助信息
    -debug                      是否开启 debug 模式,打印更详细的日志
    

    以下是一些技术点总结:

    • 使用 ffmpeg 的过滤器select,结合scene,实现按照场景帧来提取视频帧,而不是机械的每 n 秒一帧,画面更有代表性;
    • 结合select中的prev_selected_t,实现场景帧太密集或太稀疏的优化,实现最小间隔和最大间隔;
    3 条回复    2024-04-29 00:47:34 +08:00
    archxm
        1
    archxm  
       14 天前
    不错啊,优秀的分享
    lamquan
        2
    lamquan  
       14 天前
    这个脚本本身是没有问题的,可以将 ffmpeg 的场景帧转换成 pbf 文件。但受限于 ffmpeg 的场景识别能力,最终的结果并不理想。
    用过类似的独立小软件叫 PySceneDetect, https://github.com/Breakthrough/PySceneDetect
    可以按场景分割,也可以保存为图片,还可以输出为时间码,也可以修改原码直接转换成 pbf 。
    kuanat
        3
    kuanat  
       13 天前
    楼上说得很对,ffmpeg 几乎大部分 filter 都有附带的 scene detection ,这是一个效率优先的实现,需要根据目标视频反复测试参数阈值。

    原理是以 YUV 信号提取帧的 luma 亮度信息,速度虽然快,但主要是适应动、静态的场景转换。对于比如讲座类视频效果就不好。

    达到目标还有很多思路,比如相似性 hash ,点云等等,主要看目标视频的特性。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3079 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 15:08 · PVG 23:08 · LAX 08:08 · JFK 11:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.