前几天看 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 模式,打印更详细的日志
以下是一些技术点总结:
select
,结合scene
,实现按照场景帧来提取视频帧,而不是机械的每 n 秒一帧,画面更有代表性;select
中的prev_selected_t
,实现场景帧太密集或太稀疏的优化,实现最小间隔和最大间隔; 1
archxm 203 天前
不错啊,优秀的分享
|
2
lamquan 203 天前
这个脚本本身是没有问题的,可以将 ffmpeg 的场景帧转换成 pbf 文件。但受限于 ffmpeg 的场景识别能力,最终的结果并不理想。
用过类似的独立小软件叫 PySceneDetect, https://github.com/Breakthrough/PySceneDetect 可以按场景分割,也可以保存为图片,还可以输出为时间码,也可以修改原码直接转换成 pbf 。 |
3
kuanat 203 天前
楼上说得很对,ffmpeg 几乎大部分 filter 都有附带的 scene detection ,这是一个效率优先的实现,需要根据目标视频反复测试参数阈值。
原理是以 YUV 信号提取帧的 luma 亮度信息,速度虽然快,但主要是适应动、静态的场景转换。对于比如讲座类视频效果就不好。 达到目标还有很多思路,比如相似性 hash ,点云等等,主要看目标视频的特性。 |