前几天看 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,实现场景帧太密集或太稀疏的优化,实现最小间隔和最大间隔;