Install
openclaw skills install @pdxingqq/short-video-reverse-engineer用于对短视频进行反向工程分析:自动提取关键帧、语音转文字、逐帧视觉分析,并生成包含 AI 提示词(仅中文)、台词时间轴、制作建议的 HTML 分析报告。含合规检查(侵权/违规内容排查)和 10 秒适配方案。适用于抖音/快手/视频号等短视频的内容拆解与二次创作。
openclaw skills install @pdxingqq/short-video-reverse-engineer本技能用于将单个短视频自动拆解为:关键帧截图、带时间戳的台词、视觉元素分析,以及可复用的 AI 生成提示词,最终输出为结构化的 HTML 分析报告(含合规检查 + 10 秒适配方案)。适用于短视频二创、AI 复刻、剧本学习等场景。
扫描指定目录(默认 ~/Desktop/视频素材/,可按需修改)下的 .mp4/.mov/.avi/.mkv/.webm 文件,跳过子目录(尤其是 已处理/)。
积分优化:将原来的帧提取、音频提取、Whisper转写、逐帧读取(~15次工具调用)合并为 1次 Bash 调用 + 1次图片读取。
使用 scripts/extract_video_one_shot.py 一步完成:
python scripts/extract_video_one_shot.py "视频路径" "临时目录"
脚本自动完成(每次先清空旧帧,防止不同视频的帧混在一起):
frames/ 目录中的旧帧frames/frame_XXXX.jpgtranscript.jsoncontact_sheet.jpg脚本输出(stdout JSON)包含:帧数、时长、台词全文、各文件路径。
读取 contact_sheet.jpg(1 张拼图替代原来 9 张单独读取),从以下维度分析:
积分对比:旧流程读 9 张图 = 9 次图片读取 → 新流程读 1 张拼图 = 1 次图片读取,节省约 88% 图片读取积分。
在生成提示词和报告前,对所有输出内容进行侵权/违规风险排查并修正:
| 风险类型 | 示例 | 处理方式 |
|---|---|---|
| 官方标识模仿 | 红色横幅"高考考点"、政府机关名称 | 改为通用标语(如"考试顺利")或虚构名称 |
| 真实机构/学校名 | "XX市第三高中"、"XX大学" | 改为"学校门口"、"某中学"等通用表述 |
| 真实证件信息 | 准考证号、身份证号、学号 | 改为"个人信息区域",标注"虚构道具" |
| 风格绑定特定国家 | "日式动漫风格" | 改为"国漫风格"或"二维动漫风格" |
| 品牌/商标 | 可辨识的品牌Logo、产品名 | 模糊处理或替换为虚构品牌 |
| 敏感社会议题 | 涉及政治、宗教、民族敏感内容 | 中性化表述或删除 |
只输出 HTML 版本,不再输出 docx。
报告结构必须包含以下部分(按序号排列,用 h2 标题):
一、视频信息 → 文件名/时长/分辨率/台词数 二、合规检查 → 侵权/违规风险排查 三、关键帧分镜图 → contact sheet 拼图(base64 内嵌) 四、视觉元素分析 → 画风/角色/场景/色彩/叙事结构 五、台词时间轴 → 完整对话提取表 六、10秒适配方案 → 压缩策略 + 备用分段方案 + ffmpeg 命令 七、AI生成提示词 → 豆包使用指引 + char_ref.jpg + Prompt(一完整版→二压缩版→三分段版) 八、制作建议 → 工具/工作流/参数
关键帧展示格式:使用
contact_sheet.jpg(多宫格拼图)替代逐张展示,节省积分且更直观。如需详细描述,在分镜图下方附描述列表。分镜图风格一致(v4.9):全片 contact sheet 和分段分镜图共用同一套生成参数(thumb=原帧1/2、gap=4px、bg=#1E1E23、无label),由 gen 脚本统一生成,不依赖 extract_video_one_shot.py 的输出。
Prompt 输出规则(豆包友好格式,强制):
【】 标记(如 【场景】 【角色】 【台词与动作】)①②③④ 分镜编号【镜头】 【色调】 【字幕规格】 等技术参数标签make_seg_preview_sheet() 统一生成,max-width:600px。<p><strong>视频时长:X.Xs | 台词时长:X.Xs</strong></p>,压缩版/分段版显示估算值时用 ~ 前缀CHAR_DESC 角色外观设定块CHAR_DESC 块char_ref.jpg(统一角色参考图),禁止用分段分镜图(segN_contact_sheet.jpg)作为豆包参考图用户使用豆包等工具生成视频,单次上限 10 秒。报告生成后自动检测台词总时长,按以下策略输出适配方案:
判断逻辑:
| 台词总时长 | 策略 | 说明 |
|---|---|---|
| ≤10s | 直接可用 | 报告中的提示词可直接提交生成 |
| 10-20s | 方案 B:剧本压缩 | 用 AI 精简台词到 ≤10s,保留核心冲突和反转。如压缩后仍超 10s,最多分 2 段 |
| >20s | 方案 A:分段拼接 | 按叙事断点拆 2-N 段(各 ≤10s),逐段生成后 ffmpeg 拼接 |
方案 B 剧本压缩规则(10-20s 视频):
方案 A 分段拼接规则(>20s 视频):
-vf "fade=in:0:7,fade=out:0:7" 类似参数)输出格式: 在报告 HTML 末尾新增"10 秒适配方案"板块,包含:
豆包每次生成是独立的,不同片段间容易出现人物/风格不一致。此步骤解决该问题。
从全片挑选最能展示所有角色的帧(推荐 4 帧,横排单行排列,每帧 360px 高,9:16 竖屏裁剪),拼成一张统一角色参考图。命名为 char_ref.jpg,放在参考图目录中。
核心原则:所有片段共用同一张
char_ref.jpg作为豆包参考图。只生成单帧/角色展示图,不生成多帧拼图(contact sheet),后者会导致豆包输出变成多格模式。
在每个 Prompt 末尾追加统一的角色设定段落,所有片段内容完全一致:
角色外观统一设定(所有片段必须严格一致):
[角色A]:发型、衣着、脸型、身材、表情范围
[角色B]:发型、衣着、脸型、身材、表情范围
场景/画风:统一的背景和风格描述
强制要求:每个分段 Prompt(完整版/片段1/片段2/压缩版)末尾必须追加完全相同的 CHAR_DESC 块。 Prompt 展示顺序(v4.10):一、完整版 → 二、压缩版 → 三、分段版。统一用 h3 标题编号,分段版的子片段用 h4。
积分优化:旧流程每个视频生成
char_ref.jpg + N张seg_ref单帧 + 4张预览拼图并全部base64内嵌到HTML,HTML体积巨大且写入成本高。v4.23 起只保留以下文件,HTML 改为引用本地文件:
输出目录:~/Desktop/剧本输出/{视频名}_豆包参考图/
只保留 5 个文件:
char_ref.jpg(所有片段共用,导出全部已提取帧横排单行排列,9:16竖屏裁剪)→ ✅ 可上传豆包删除:❌ 不再导出 segN_ref_XX_tXs.jpg 单帧高清图。这些单帧数量多、占用大、与预览图功能重复,且上传豆包容易触发多格模式。
HTML 图片策略:预览图和 char_ref 均使用相对路径引用(如 <img src="视频名_豆包参考图/char_ref.jpg">),不再 base64 内嵌。好处:
目录迁移注意:移动 HTML 时必须同时移动对应的
{视频名}_豆包参考图/目录,否则图片链接失效。
报告中必须包含以下指引(放在 Prompt 区域上方,醒目样式):
📋 豆包生成步骤(保证片段间一致性):
- 下载
char_ref.jpg(统一角色参考图,所有片段共用)- 生成片段1:上传
char_ref.jpg+ 粘贴片段1 Prompt- 生成片段2:上传 同一张
char_ref.jpg+ 粘贴片段2 Prompt(Prompt 开头已含"接上一段")- 生成片段3…同上,始终用同一张
char_ref.jpg⚠️ 只上传普通单帧图片。多帧拼图(contact sheet)会导致豆包把视频也生成为多格模式,已不再生成。
尺寸说明:参考图按 9:16 竖屏裁剪(405×720),满足豆包最低尺寸要求。
~/Desktop/剧本输出/[视频名]_细化分析报告.html(仅 HTML,不输出 docx)~/Desktop/剧本输出/[视频名]_豆包参考图/(Step 7 生成)~/Desktop/视频素材/已处理/注意:视频生成交由用户在豆包等工具中手动完成。本工作流终点为 HTML 报告 + 10 秒适配方案输出 + 豆包参考图(含角色一致性保证)。
运行脚本前需确保安装:
python -m pip install openai-whisper imageio-ffmpeg python-docx pillow
ffmpeg 由 imageio-ffmpeg 自动下载静态构建。Whisper 调用的是命令行 ffmpeg,因此需要把 imageio-ffmpeg 的二进制复制一份命名为 ffmpeg.exe(Windows)或创建同名软链接(Linux/macOS):
# Windows 示例
cp ffmpeg-win-x86_64-v7.1.exe ffmpeg.exe
本技能包含以下脚本(位于 scripts/ 目录):
scripts/extract_video_one_shot.py:一键提取(帧+音频+Whisper+contact sheet),积分优化核心脚本。v4.22 新增 msys 路径自动转换(/c/Users/... → C:/Users/...),杜绝 0 帧重试。scripts/gen_report_template.py:可复用 HTML 报告模板(v4.22,积分优化核心)。读取 JSON 配置文件渲染报告,模板只写一次。v4.23 移除单帧导出、不再 base64 内嵌图片。scripts/batch_generate_reports.py:批量报告生成(v4.23)。一次处理多个 config_*.json,把每个视频单独调用一次 Bash 改成一次批量调用。路径配置:脚本中的默认路径(如
~/Desktop/视频素材/、ffmpeg 位置)需根据实际用户环境调整。首次使用时检查并修改脚本中的路径常量。
# 1. 一键提取(帧+音频+转写+contact sheet,1次调用)
# 路径可用 msys 或 Windows 格式,脚本自动转换
python scripts/extract_video_one_shot.py "视频路径" "临时目录"
# 2. 读取 contact_sheet.jpg + transcript stdout 进行视觉分析(1次图片读取)
# 3. 批量写 JSON 配置(每个视频一个 JSON 文件,零语法错误风险)
# 4. 批量运行模板生成报告(v4.23:一次 Bash 处理多个视频)
python scripts/batch_generate_reports.py <configs_dir>
v4.22 积分优化说明:旧流程每个视频写 500+ 行 Python 脚本(内嵌分析数据),中文引号频繁触发 SyntaxError,每次需要 5-15 次 Edit 修复。新流程分析数据写 JSON(天然零语法错误),预编译模板一次复用,节省 50%+ 报告生成积分。
当作为 WorkBuddy 自动化任务运行时,按以下顺序执行:
.workbuddy/automations/<automation_id>/memory.md 查看历史scripts/extract_video_one_shot.py(帧+音频+Whisper+contact sheet 合并为 1 次调用)。路径可用任意格式,脚本自动转换。contact_sheet.jpg(1 张拼图)进行视觉分析,替代逐帧读取write_config_xxx.py),包含全部分析数据。JSON 格式天然无 Python 语法错误,彻底消除 Edit 修复循环。scripts/batch_generate_reports.py <configs_dir> 一次批量生成所有 HTML 分析报告(仅 HTML,不输出 docx)present_files 向用户展示报告积分优化:旧流程约 25-35 次工具调用(含 5-15 次 Edit 修复语法错误)→ 新流程约 10-13 次工具调用(0 次 Edit 修复),节省约 60-70% 总积分。
.workbuddy/temp_video_analysis/extract_video_one_shot.py 一键提取 + contact sheet 拼图替代逐帧读取,减少约 70% 工具调用<div class="prompt-content" contenteditable="true" data-original="{prompt变量}">{prompt变量}</div>(注意是 <div> 不是 <span>,必须带 contenteditable="true" 和 data-original 属性)contenteditable="true" 时显示虚线金边 + 深色背景,聚焦时变为实线.prompt-content[contenteditable="true"] { outline: 2px dashed #f0c75e; background: #1c2030; border-radius: 4px; padding: 10px; cursor: text; }
.prompt-content[contenteditable="true"]:focus { outline: 2px solid #f0c75e; background: #1e2232; }
data-orig(DOMContentLoaded 事件),复制按钮复制编辑后的 innerText,重置按钮通过 data-orig 恢复原文.prompt-content 必须设置 padding-top: 30px,否则绝对定位的"复制""重置"按钮会遮住 Prompt 第一行文本。两种方案可选:① .prompt-box { padding: 40px 20px 20px }(按钮悬停在 box padding 区);② .prompt-content { padding-top: 30px }(文本下推 30px)。推荐方案①(box padding 预留按钮空间),gen_npy_v410.py 和 gen_sy_v410.py 已修复。imageio_ffmpeg 自带的 ffmpeg 不在 PATH 中imageio_ffmpeg/binaries/ffmpeg.exe 复制到 Python/Scripts/ffmpeg.exe/tmp/xxx),必须用 cygpath -w 转 Windows 风格scripts/extract_video_one_shot.py 时,视频路径和 temp_dir 都必须使用 Windows 风格路径(如 C:/Users/.../视频素材/xxx.mp4),不能使用 msys 风格(如 /c/Users/.../Desktop/...),否则 ffmpeg 会提取 0 帧并报音频文件不存在cp 实体文件extract_video_one_shot.py 的 find_ffmpeg() 和 Whisper PATH 设置均指向 versions/3.13.12/Scripts/ffmpeg.exe(而非已废弃的 envs/default/Scripts/)UnrecognizedImageError(baseline 8 mjpeg 探针问题)from PIL import Image
img = Image.open(raw_path)
img.save(out_path, "JPEG", quality=92, optimize=True)
"他说:\"你好\"" 的写法极易触发字符串提前闭合(unicode error) 'unicodeescape' codec can't decode bytes in position X-Y: truncated \uXXXX escape\u7ad6 这种转义写中文 prompt 时,手抖写成 \u7豎 (把"竖"字误填进 hex 位) 或 \u飩车 (开头就不是 4 位 hex)fix_unicode_robust.py 一次性修复:
import re
HEX4_RE = re.compile(r'\\u([0-9a-fA-F]{4})') # 必须 raw string,避免正则本身被解析为 \u
BARE_U_RE = re.compile(r'\\u(?![0-9a-fA-F]{4})')
text = BARE_U_RE.sub('', text) # 删掉非法的 \u
text = HEX4_RE.sub(lambda m: chr(int(m.group(1), 16)), text) # 合法 \uXXXX 还原为字面字符
\uXXXX 转义。如必须使用,提交前先跑这个 fix 脚本过一遍