视频抽帧
官方脚本
可调用节点
v2.1.0
基于 FFmpeg 的视频抽帧脚本 | 支持按秒/按帧间隔、指定时间点、关键帧、智能抽帧(相似度去重),输出 PNG 图片序列,一键批量抽帧;可作节点被联动调用,支持定时任务
脚本能力
直接启动支持
右键启动支持
快捷键启动支持
超级复制启动不支持
定时任务支持
可被其他脚本调用是
依赖其他脚本否
图形化启动界面支持
一键从视频中抽取关键画面并导出为 PNG 图片。内置 5 种抽帧方式:按秒、按帧间隔、指定时间点、关键帧、智能抽帧。基于 FFmpeg 引擎,支持批量处理。
核心特性
- 5 种抽取方式:
- 按秒抽帧:每 N 秒抽一帧(如每 5 秒)
- 固定间隔帧:每 N 帧抽一帧(如每 30 帧)
- 指定时间点:在指定时间点抽帧(如 00:00:05、00:00:15)
- 关键帧抽取:只抽关键帧(I 帧)
- 智能抽帧:基于相似度去重,自动保留视觉上显著不同的画面(阈值可调 0.5~0.95),可捕捉幻灯片文字变化、只留睁眼帧、从指定时间点开始
- 盒子自动生成配置窗口:启动前弹出运行参数界面,参数按「抽帧方式」联动显隐,并自动回填上次配置
- 右键菜单集成:选中视频 → 右键 → 视频抽帧
- 批量处理:支持同时选中多个视频文件批量抽帧
- PNG 无损输出:图片无损压缩,适合后续编辑
- 每视频一文件夹:输出到
<视频名>_frames子文件夹,多视频不混淆 - 自定义输出目录:可指定输出位置,留空则在视频所在目录下建子文件夹
- 智能跳过:已存在的输出自动跳过(可开启覆盖)
- 实时进度:抽帧过程中实时显示百分比与已处理时长
- 节点联动:可被其他脚本通过
/api/link调用,返回结果摘要与输出目录列表 - 定时任务:声明可被盒子调度,无人值守自动跑完
脚本演示

安装方法
本脚本的运行环境、依赖组件及图形化窗口均依赖“不忙脚本盒子”,建议仅通过盒子安装和使用本脚本。
前置条件:安装好 不忙脚本盒子
- 打开盒子 → 脚本市场 → 搜索 「视频抽帧」
- 点击「安装」
使用方式
-
直接启动
- 在不忙脚本盒子里点击「智能抽帧」卡片
- 在图像界面中添加视频文件并设定抽帧模式
- 点击执行,自动批量抽帧并在控制台显示进度
-
右键启动
- 在文件管理器中选中视频文件,右键点击,选择「视频抽帧」
- 在弹出的配置窗口确认参数,点击执行,自动批量抽帧并在控制台显示进度
-
快捷键启动
- 为脚本设置全局快捷键
- 选中视频后按下快捷键即可快速执行
💡 使用提示
- 按秒抽帧:适合制作缩略图、快速浏览视频内容
- 智能抽帧:与上一张已保留画面比较相似度,相似则跳过、显著不同才保存,能跨相似片段自动去重。阈值越高保留帧越多(0.95 几乎每个变化都保留,0.5 只留差别很大的画面)
- 检测幻灯片文字变化(refine):直方图会漏掉"画面静止但标题/文字变了"的场景,勾选后用 HOG/ORB 复核可捕捉(如 PPT)
- 仅保留睁眼帧:只保存检测到有人睁眼的画面(适合访谈/录课)
- 起始时间:从指定秒数开始抽取,留空从头开始
- 关键帧抽取:只输出 I 帧,数量取决于编码间隔,通常远小于总帧数
- 输出位置:默认在视频所在目录下建
<视频名>_frames文件夹,指定输出目录后在其下建文件夹 - 覆盖说明:默认跳过已存在的输出文件夹,勾选「覆盖已存在的文件」后会清空旧图重新抽取
节点脚本(开发者阅读)
本脚本已完成节点声明及数据回传。其他脚本可通过「不忙脚本盒子」提供的统一接口 /api/link 调用本脚本执行视频抽帧:
# 调用方示例(A 脚本内)
r = requests.post(f"{api_base}/api/link", json={
"script_id": "<视频抽帧 script_id>",
"data": {"target_paths": ["C:/a.mp4"]},
"params": {"mode": "second", "interval": 5},
})
result = r.json()["result"] # {code, msg, result, output_dirs}
返回信封业务键:
result:处理结果摘要(如「成功 1 个 · 失败 0 个」)output_dirs:生成的帧图片目录绝对路径列表
🖥️ 环境要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows 10+(64位) |
| 运行环境 | Python 3.12+, FFmpeg |
本脚本已声明为节点,可被其他脚本通过「不忙脚本盒子」机制调用。完整配置见下方 TOML,其他脚本若需调用请严格按此配置构造请求。
bm-scripts-box-rc.toml
[bmscriptsbox]
[bmscriptsbox.info]
id = "9d2c6b4a-1e8f-4a3c-9b7d-5c0e2f8a41b3"
name = "视频抽帧"
desc = "基于 FFmpeg 的视频抽帧脚本 | 支持按秒/按帧间隔、指定时间点、关键帧、智能抽帧(相似度去重),输出 PNG 图片序列,一键批量抽帧;可作节点被联动调用,支持定时任务"
version = "2.1.0"
icon = "./imgs/img.png"
[bmscriptsbox.runtime]
language = "python"
language_version = ">=3.12"
entry = "main.py"
terminal = "always"
binaries = [{name = "ffmpeg"}]
[[bmscriptsbox.inputs]]
name = "target_paths"
type = "list"
pick = "files"
exts = [".mp4", ".mkv", ".avi", ".mov", ".webm", ".flv", ".wmv", ".ts", ".m4v",
".mpg", ".mpeg", ".m2ts", ".mts", ".3gp", ".ogv", ".vob", ".rmvb", ".rm", ".asf"]
label = "视频文件"
description = "要抽帧的视频文件"
[bmscriptsbox.triggers.context_menu]
enabled = true
targets = ["files"]
filters = [".mp4", ".mkv", ".avi", ".mov", ".webm", ".flv", ".wmv", ".ts", ".m4v",
".mpg", ".mpeg", ".m2ts", ".mts", ".3gp", ".ogv", ".vob", ".rmvb", ".rm", ".asf"]
[bmscriptsbox.triggers.shortcut]
enabled = true
input_type = "files"
filters = [".mp4", ".mkv", ".avi", ".mov", ".webm", ".flv", ".wmv", ".ts", ".m4v",
".mpg", ".mpeg", ".m2ts", ".mts", ".3gp", ".ogv", ".vob", ".rmvb", ".rm", ".asf"]
# ── 运行参数(盒子自动生成运行界面,when 联动显隐) ──
[[bmscriptsbox.params]]
name = "mode"
type = "str"
default = "smart"
choices = ["smart", "second", "frame", "timestamp", "keyframe"]
choice_labels = { smart="智能", second="按秒", frame="按帧",timestamp="按时间",keyframe="关键帧" }
label = "抽帧方式"
description = "抽帧方式"
[[bmscriptsbox.params]]
name = "interval"
type = "int"
default = 5
when = { field = "mode", in = ["second", "frame"] }
label = "抽帧间隔"
[[bmscriptsbox.params]]
name = "timestamps"
type = "str"
when = { field = "mode", eq = "timestamp" }
label = "指定时间"
description = "格式:00:00:05,00:00:15"
[[bmscriptsbox.params]]
name = "threshold"
type = "str"
default = "0.78"
choices = ["0.5", "0.6", "0.65", "0.7", "0.75", "0.78", "0.8", "0.85", "0.9", "0.95"]
when = { field = "mode", eq = "smart" }
label="相似阈值"
description = "画面相似度阈值"
[[bmscriptsbox.params]]
name = "smart_refine"
type = "bool"
default = false
when = { field = "mode", eq = "smart" }
label = "文字检测"
description = "检测画面上文字"
[[bmscriptsbox.params]]
name = "smart_open_eyes"
type = "bool"
default = false
when = { field = "mode", eq = "smart" }
label = "仅睁眼帧"
description = "仅睁眼帧"
[[bmscriptsbox.params]]
name = "smart_start"
type = "str"
default = ""
when = { field = "mode", eq = "smart" }
label = "起始时间"
description = "为空则从头抽、格式为秒、例:10"
[[bmscriptsbox.params]]
name = "output_dir"
type = "str"
default = ""
label = "输出目录"
description = "为空则输出到源视频目录下"
[[bmscriptsbox.params]]
name = "overwrite"
type = "bool"
default = false
label = "覆盖文件"
description = "覆盖文件"
# 自动生成运行界面
[bmscriptsbox.params_form]
enabled = true
# 节点:允许被其他脚本联动调用
[bmscriptsbox.node]
enabled = true
[[bmscriptsbox.outputs]]
name = "result"
type = "str"
description = "处理结果摘要,如「成功 3 个 · 失败 1 个」"
[[bmscriptsbox.outputs]]
name = "output_dirs"
type = "list"
description = "生成的帧图片目录绝对路径列表(<视频名>_frames)"
# 定时任务:允许无人值守调度
[bmscriptsbox.schedule]
enabled = true
免责声明
所有脚本由用户通过开源仓库自行发布。本站仅提供索引服务,"不忙脚本盒子"仅提供展示与安装服务。请在使用前仔细核实脚本内容,作者不对其安全性、准确性及适用性作任何保证。