AI MEDIAKIT VIDEO EDIT

基于弹幕与字幕分析,自动提取高能片段并合成带转场的视频。

已扫描
适合谁
视频创作者、内容运营人员
不适合谁
无弹幕或字幕的视频用户、无需自动化剪辑的用户
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @volc-ai-mediakit/ai-mediakit-videoedit

Skill 说明

命令、参数、文件名以原文为准

AI 视频智能剪辑技能。输入视频文件路径(支持多个),可选弹幕文件路径,可选字幕文件路径,

结合弹幕与字幕内容理解视频上下文,根据用户编辑请求自动提取对应时间段(如“提取所有精彩片段”、“剪掉解释 xxx 的部分”),进行拼接并添加转场效果,最后使用 FFmpeg 合成输出视频。

当用户提及“视频剪辑”、“按弹幕剪视频”、“提取弹幕精彩片段”、“视频片段拼接”、“弹幕分析剪辑”、“从弹幕中找亮点”、“智能剪辑”时,此技能必须被触发。

version: v1.0.1

---------------

AI 视频智能剪辑

概述

该技能通过分析弹幕和字幕内容,帮助用户理解视频上下文,根据编辑请求自动提取并拼接视频片段,并使用 FFmpeg 完成转场效果及最终合成。

输入规范

  • 视频文件(必填,支持多个):本地视频文件路径,支持格式如 .mp4.flv.mkv 等。
  • 弹幕文件(可选,每个视频一个):XML 格式弹幕文件(支持 Bilibili 格式),与视频文件一一对应,按顺序排列。
  • 字幕文件(可选,每个视频一个):.srt / .ass / .json 格式字幕文件,与视频文件一一对应,按顺序排列;无字幕的视频请留空。

注意:字幕和弹幕是理解视频内容的唯一依据。若某视频未提供字幕和弹幕,则无法理解其内容,仅能执行用户明确给出的时间段指令。

工作流程

步骤 0:依赖项验证

在执行任何操作前,需确认运行环境满足要求。

验证命令:

python --version
ffmpeg -version 2>&1 | head -1
ffprobe -version 2>&1 | head -1
node --version

验收标准与修复指南:

依赖项最低要求验证方法未满足时的安装命令
Python3.9+python --version参见下方说明
ffmpeg任意版本ffmpeg -versionmacOS: brew install ffmpeg · Linux: sudo apt install ffmpeg · Windows: [ffmpeg.org](https://ffmpeg.org/download.html)
ffprobe与 ffmpeg 一同安装ffprobe -version随 ffmpeg 一起安装,无需单独操作
Node.js18+node --versionmacOS: brew install node · 或访问 [nodejs.org](https://nodejs.org/)

Python 安装说明(如版本不满足):

  • macOS: brew install python@3.11
  • Linux: sudo apt install python3.11
  • 或通过 [pyenv](https://github.com/pyenv/pyenv):pyenv install 3.11 && pyenv global 3.11

文字特效渲染依赖(Remotion)安装:

检查是否存在 byted-ai-mediakit-videoedit/template/node_modules

ls byted-ai-mediakit-videoedit/template/node_modules/@remotion/renderer 2>/dev/null && echo "已安装" || echo "需要安装"

若未安装,请执行:

cd byted-ai-mediakit-videoedit/template && npm install

安装耗时约 1-2 分钟,完成后目录中将出现 node_modules。后续对话中若已存在则跳过此步骤。

处理规则:

  • 所有依赖均满足 → 进入下一步
  • 缺失或版本不足 → 向用户说明缺失项,提供对应平台的安装命令,等待用户完成安装并重新确认后方可继续

步骤 1:检查每段视频的可理解性

在开始分析前,需逐一确认每段视频是否具备字幕或弹幕:

视频是否有字幕是否有弹幕可理解性
video_A.mp4智能分析:可基于内容语义理解视频,支持“找亮点”“找出场介绍”等语义类请求
video_B.mp4降级智能分析:通过弹幕推断内容,准确性低于字幕
video_C.mp4仅支持显式指令:无法理解内容,仅可按用户提供的精确时间段进行剪辑

“仅支持显式指令”视频的处理规则:

  1. 用户明确提供时间片段(例如:“从视频_C的1:00–2:30处剪辑”):直接使用,无需分析
  2. 用户提出内容请求(例如:“在视频_C中找到出场介绍部分”):立即告知用户该视频无字幕或弹幕,无法进行内容分析,请提供:

- 明确的时间片段,或

- 字幕文件或弹幕文件

  1. 混合场景(部分视频可理解,部分不可理解):对可理解的视频正常分析,对不可理解的视频单独说明限制,并询问用户如何处理

步骤 3:解析弹幕与字幕

运行解析脚本,将弹幕和字幕转换为基于时间线的文字摘要,用于视频内容分析。

单个视频(含字幕 + 弹幕):

python byted-ai-mediakit-videoedit/scripts/parse_media_info.py \
  --video ep1.mp4 \
  --danmaku ep1.xml \
  --subtitle ep1.srt \
  --output /tmp/media_timeline.json

**单个视频(仅含字幕 —— 省略 --danmaku):**

python byted-ai-mediakit-videoedit/scripts/parse_media_info.py \
  --video ep1.mp4 \
  --subtitle ep1.srt \
  --output /tmp/media_timeline.json

**多个视频(为每段视频重复 --video/--danmaku/--subtitle 参数):**

python byted-ai-mediakit-videoedit/scripts/parse_media_info.py \
  --video ep1.mp4 --danmaku ep1.xml --subtitle ep1.srt \
  --video ep2.mp4 --danmaku ep2.xml \
  --output /tmp/media_timeline.json

重要提示:仅对包含字幕或弹幕的视频运行此脚本。 未同时具备字幕和弹幕的视频不会被传入该脚本,其时间段将由用户提供。

可选参数:

  • --interval 5:弹幕摘要的时间间隔(秒),默认值为 5
  • --top-danmaku 10:每个时间区间内最频繁的弹幕数量,默认值为 10
  • --include-danmaku:强制在输出中包含弹幕摘要(即使已有字幕);仅当用户明确要求参考弹幕时才添加此参数(需为该视频提供 --danmaku 文件)
  • --video 可省略,若仅传入 --danmaku 或仅传入 --subtitle(脚本使用文件基础名作为视频标识符);**建议显式指定 --video 并使用真实路径**,以确保 JSON 中的 video_file 与后续剪辑步骤匹配
  • --danmaku 可省略,若视频已有字幕;每个视频必须至少包含弹幕或字幕之一
  • --subtitle 可省略,若视频仅有弹幕

脚本根据以下规则自动决定输出内容(无需 Claude 额外判断):

输入情况写入时间线的内容输出模式
有字幕,未加 --include-danmaku仅字幕条目subtitle_only
无字幕仅弹幕时间区间摘要danmaku_only
有字幕且加 --include-danmaku字幕 + 弹幕摘要subtitle_and_danmaku

输出文件的顶层字段 content_mode 表示当前模式,Claude 可直接根据该字段确认时间线中包含的内容类型。

脚本输出为 JSON 格式的时间线,弹幕不会逐条写出,而是按时间区间汇总。时间线中包含两类记录:

弹幕时间区间摘要(type = danmaku_summary):

{
  "time": 25.0,
  "time_start": 25.0,
  "time_end": 30.0,
  "type": "danmaku_summary",
  "total_count": 38,
  "density": 456.0,
  "top_danmaku": [
    {"text": "666", "count": 12},
    {"text": "哈哈哈", "count": 8}
  ],
  "video_file": "ep1.mp4"
}

字幕条目(type = subtitle,完整保留):

{
  "time": 27.3,
  "end_time": 30.1,
  "type": "subtitle",
  "text": "这一波操作太丝滑了",
  "video_file": "ep1.mp4"
}

顶层字段说明:

  • videos:各视频的统计信息及其对应的高光峰值列表
  • density_peaks:跨所有视频的全局高光峰值(包含 video_filetop_danmaku 字段)
  • summary.peak_times:前 5 个高光时段的简要信息(包含位置、密度、代表性弹幕)

步骤 4:分析视频内容,理解剪辑需求

读取 /tmp/media_timeline.json,结合用户的剪辑需求,推断需要提取的时间片段列表。

前置检查:跳过无法分析的视频

在内容分析前,仅处理步骤 0 中确定为“智能分析”的视频。对于“仅显式指令”的视频,跳过分析,直接使用用户提供的时间值作为剪辑的 start/end

分析策略:

首要原则:根据字幕确定内容理解方式

情况内容理解方法
存在字幕文件仅阅读字幕以理解视频内容,忽略弹幕数据(除非用户明确要求参考弹幕)
不存在字幕文件仅阅读弹幕摘要danmaku_summary)以理解视频内容及高光时刻
用户明确表示“参考弹幕”无论是否有字幕,均同时阅读字幕和弹幕

Skill: AI MEDIAKIT VIDEO EDIT

Version: 1.0.2

Chunk: 3/6

原因说明:字幕是视频音频内容的精确记录,直接表达视频语义;弹幕则是观众的即时反应,包含大量噪声(如刷屏、无关内容)。当存在字幕时,弹幕信息的边际收益较低,且会消耗大量上下文资源。


有字幕(主路径)

  • 通过字幕文本理解视频内容,定位用户感兴趣的话题、关键句子、段落
  • 直接在字幕中搜索关键词
  • 剪辑边界严格对齐字幕句子边界(详见下方“确定剪辑边界”部分)

无字幕(降级路径)

  • 读取 type=danmaku_summary 类型的条目,根据 density(每分钟数量)判断热度
  • density_peaks 已预先识别出密度最高的时间段,可直接作为高光候选区间
  • 通过 top_danmaku 列表推断该时间段内的视频内容或情绪倾向
  • 常见高光弹幕关键词:"www""哈哈""666""awsl""绝了""牛""真的假的""名场面"
  • 负面弹幕(如 "笑死""可怜")需结合上下文进行判断

多视频分析注意事项

  • 时间线中的每条记录均包含 video_file 字段,分析时必须区分不同视频的时间线,不可混用时间偏移
  • 确定剪辑的 start/end 时,仅使用对应记录 video_file 的字幕或弹幕数据
  • 最终输出的剪辑 JSON 中,每个剪辑的 video_file 字段必须与时间线来源视频一致

确定剪辑边界

  • 有字幕时:起止点必须基于字幕内容,确保每个剪辑为完整句子:

1. 定位候选区间:根据字幕关键词或弹幕密度(用户请求时)确定大致兴趣范围

2. 对齐开始时间:找到候选区间起始前最近的一条字幕的 time;若开头语义不完整(如出现“而且”、“但是”等连接词),则继续向前推进

3. 对齐结束时间:找到候选区间结束之后最近的一条字幕的 end_time,确保最后一句语义完整

4. 检查完整性:确认剪辑覆盖的字幕内容具备完整语义(不以逗号、过渡词或不完整分句结尾)

  • 无字幕时:以弹幕高光区间为中心,前后分别添加 1 秒和 1.5 秒的缓冲时间作为边界

字幕记录包含 time(起始秒数)和 end_time(结束秒数),可直接用于边界对齐。

  • 剪辑时长至少 3 秒,最大长度由内容决定(通常单个剪辑不超过 60 秒)

输出格式(内部推理结果,JSON)

{
  "clips": [
    {
      "video_file": "/path/to/video.mp4",
      "start": 125.3,
      "end": 142.8,
      "reason": "Danmaku density peak, lots of '666' and '绝了' danmaku, corresponding subtitles show player completed difficult operation"
    }
  ],
  "transition": "fade",
  "normalize_audio": true,
  "output_path": "/tmp/output_cut.mp4"
}

normalize_audio 默认值为 false,仅在用户明确确认后执行。对于多个剪辑,可启用两遍 EBU R128 音量归一化(目标 -16 LUFS / -1.5 dBTP),以消除不同视频源之间的音量差异。单个剪辑无需此操作。


第五步:选择转场效果

若用户明确指定了转场效果,则直接采用。若未指定,则根据对弹幕和字幕的理解,推断最合适的转场效果,遵循以下逻辑:

内容特征推荐转场效果判断依据
弹幕以“哈哈”“666”“牛”“绝了”等激动词汇为主,节奏快none硬切更能匹配高光时刻的冲击感
游戏/体育比赛类内容,弹幕中大量出现“冲”“gkd”“打”wipeleftwiperight水平擦除具有动态感和方向性
知识讲解/教程/评测类字幕,内容偏理性dissolve淡入淡出过渡自然,不突兀,适合信息密集型内容
情绪化/Vlog/生活类内容,弹幕包含“好看”“感动”“治愈”fade淡入淡出柔和,具有情感延续性
分步操作教程(如“第1步”“第2步”等)slideupslidedown垂直滑动具有进度感
高能量/混剪/强剪辑感内容,弹幕含“燃”“热血”“混剪”zoomin镜头推进感强烈,增强视觉冲击力与节奏感
影视化/戏剧性内容,大场景切换circleopen圆形打开具有电影质感,适合戏剧性场景转换
科技/数字/游戏亮点内容,弹幕含“数字”“代码”“科技”pixelize像素化溶解具有赛博朋克风格,契合科技主题
活动/派对/演唱会类,快速多场景切换radial径向扫掠具有舞台感,适合多场景快速切换
旅行/风景/城市探索类,场景推移smoothleft平滑左移过渡自然流畅,符合空间位移感受
混合内容或难以判断fade最通用的备选方案

推理完成后,应在回复中告知用户所选转场效果及其原因,便于用户确认或调整。

步骤 6:向用户展示编辑计划并等待确认

完成分析与转场选择后,必须以表格形式向用户展示完整编辑计划,在执行前必须等待用户明确确认,否则不得调用 cut_and_merge.py

计划展示格式:

以下是根据您的需求整理的编辑计划,请确认后再开始合成:

#视频源时间段时长内容描述
-------------------------
1xxx.mp401:29 → 01:5728s外观开场:首次介绍外观 + 色系评分
2yyy.mp402:46 → 03:0317s边框工艺变化介绍
3zzz.mp403:01 → 03:1918s三大外观风格细节

转场效果: dissolve(溶解) · 时长 0.8s · 原因:知识讲解/评测类内容适合平滑过渡

预计总时长: 约 63 秒

音量归一化: 是否启用 EBU R128 音量归一化?此步骤需对每段视频进行两遍响度分析,耗时较长(每分钟视频额外增加约 30–60 秒),但可消除不同视频源之间的音量差异。请告知是否需要启用。

是否确认执行?如需调整某段的时间、删除或替换某段内容,请告知。

支持的修改类型(用户反馈后更新计划,重新展示并等待确认):

  • 调整某段的起止时间(例如:“将第2段结束时间延后5秒”)
  • 删除或替换某段(例如:“删除第3段,替换为更具代表性的片段”)
  • 调整段落顺序(例如:“把16 Pro段落放在最前面”)
  • 更换转场效果或调整时长
  • 添加新片段

确认信号识别规则: 当用户回复“好的”“确认”“可以”“执行”“开始”“没问题”等表示同意的词语时,视为编辑计划已确认;但音量归一化需单独明确回复后方可执行

音量归一化确认规则:

  • 用户明确表示“开启”“要”“需要”“均衡”等即启用音量归一化 → normalize_audio: true,执行归一化
  • 用户明确表示“跳过”“不要”“不用”“不需要”等即跳过音量归一化 → normalize_audio: false,跳过
  • 用户直接确认执行但未提及音量归一化必须追问:“是否需要启用音量归一化?(耗时较长,每分钟视频增加约30–60秒)”,待用户回复后再执行

步骤 7:执行编辑

用户确认计划后,将最终计划写入 /tmp/clips.json,运行编辑脚本:

python byted-ai-mediakit-videoedit/scripts/cut_and_merge.py \
  --clips-json /tmp/clips.json \
  --output /path/to/output.mp4

默认过渡时长为 1 秒,可通过在 clips JSON 中设置 transition_duration 字段(单位:秒)进行覆盖。

脚本执行顺序:提取片段 → 音量归一化(两遍 loudnorm,仅当用户确认启用时执行)→ 分辨率归一化(添加黑边)→ 过渡合并 → 输出最终视频。

步骤 8(可选):添加文字特效

视频编辑完成后,询问用户是否需要添加文字特效:

视频编辑已完成。是否需要为最终视频添加文字特效?(例如弹幕爆发动画、UP主名片、章节标题、金句卡片等)

若用户选择不添加,跳至步骤 9 显示结果。若选择添加,执行以下流程:

8.1 生成特效建议

基于步骤 3 解析的字幕/弹幕数据,结合剪辑列表,推断每个片段内容对应的特效。

时间轴转换规则(关键):

特效时间戳以最终视频为准,需从原始视频时间转换:

  • 第 N 个片段在最终视频中的起始时间 = 前 N-1 个片段持续时间之和(若有过渡,则减去 transition_duration × (N-1) 秒)
  • 原始时间 T 属于第 N 个片段(原始起始时间为 S)→ 最终视频时间 = clip_N 在最终视频中的起始时间 + (T - S)

特效类型选择指南:

触发条件推荐特效说明
弹幕密度高峰(高能区间)danmakuBursts使用 top_danmaku 实现浮动弹幕,highlight 填入出现频率最高的词
弹幕包含 "666"/"绝了"/"牛"/"神操作"keyPhrases(强调)在画面顶部或底部显示该词语
字幕中包含金句quotes显示在底部或侧边
最终视频开头 0-3 秒或明显段落分界处chapterTitles显示主题,如“精彩时刻合集”
UP 主或嘉宾首次出现lowerThirds显示姓名/身份条

特效配置格式(时间单位:毫秒,相对于最终视频):

{
  "theme": "douyin",
  "videoInfo": {"width": 1920, "height": 1080},
  "chapterTitles": [
    {"title": "精彩时刻", "subtitle": "弹幕高能合集", "startMs": 0, "durationMs": 3000}
  ],
  "keyPhrases": [
    {"text": "666", "style": "emphasis", "position": "top", "startMs": 8500, "endMs": 10500}
  ],
  "danmakuBursts": [
    {"messages": ["666", "哈哈哈", "绝了", "牛啊", "名场面"], "highlight": "名场面", "startMs": 12000, "durationMs": 3000}
  ],
  "lowerThirds": [
    {"name": "UP主昵称", "role": "游戏区", "company": "bilibili", "startMs": 500, "durationMs": 5000}
  ],
  "quotes": [
    {"text": "这波操作太丝滑了", "author": "— 弹幕金句", "position": "bottom", "startMs": 25000, "durationMs": 4000}
  ]
}

可选主题: douyin(默认,适用于 Bilibili/游戏场景)、notion(知识/复习类)、cyberpunk(科技/赛博风)、aurora(渐变流光)、apple(极简风格)

8.2 向用户展示特效方案并确认

以表格形式展示所有建议特效,等待用户明确确认后才开始渲染

#类型最终视频时间内容主题
-------------------------
1章节标题0s – 3s“精彩时刻”douyin
2文字特效8.5s – 10.5s“666”(强调)douyin
3弹幕爆发12s – 15s5 条弹幕,高亮="名场面"douyin

确认后,将渲染特效并合成至视频(耗时约 1-3 分钟)。确认?

8.3 获取最终视频分辨率并写入配置

ffprobe -v quiet -select_streams v:0 \
  -show_entries stream=width,height -of json /path/to/output_cut.mp4

将获取到的 width / height 填入 effects_config.jsonvideoInfo 字段,并保存至 /tmp/effects_config.json

8.4 渲染特效(Remotion)

# 注意:必须先切换到模板目录,render.mjs 使用相对路径定位入口文件
cd byted-ai-mediakit-videoedit/template && node render.mjs \
  --config=/tmp/effects_config.json \
  --out-dir=/tmp/effects

渲染成功后,每行输出 ✅ xxx-N -> /tmp/effects/xxx-N.mov

8.5 合成特效视频

python byted-ai-mediakit-videoedit/scripts/video_effects.py \
  /path/to/output_cut.mp4 \
  /tmp/effects_config.json \
  /tmp/effects \
  /path/to/output_final.mp4

步骤 9:显示结果

完成处理后:

  1. 告知用户最终输出文件路径(含特效的 output_final.mp4,不含特效的 output_cut.mp4
  2. 说明被剪辑的片段(时间区间 + 剪辑原因)及总时长
  3. 若有特效,说明添加了哪些文字特效
  4. 若用户对结果不满意,询问是否希望调整剪辑条件、过渡效果或特效内容

错误处理

  • 弹幕文件解析失败:请检查是否为标准 XML 格式(支持 Bilibili 格式,以 <i> 为根节点,<d> 为弹幕节点)
  • 视频文件未找到:提示用户检查路径
  • FFmpeg 未安装:提示运行 brew install ffmpeg(macOS)或 apt install ffmpeg(Linux)
  • 分段时间超过视频时长:自动裁剪至视频结束
  • Remotion 渲染失败:检查是否存在 node_modules(执行 npm install),确认 Node.js 版本 ≥ 18
  • 特效合成失败:检查 /tmp/effects/ 目录中是否存在对应的 .mov 文件,确认特效渲染步骤已成功完成

注意事项

  • 多个视频时,请按顺序列出 --video;每个视频索引对应提供 --danmaku 和/或 --subtitle,顺序一致(可通过省略末尾参数隐式补全:例如两个视频可使用 --subtitle s1 --subtitle s2 而不加 --danmaku)。每个视频至少需有一个文本源
  • 弹幕时间轴基于视频播放时间(非文件挂载时间戳)
  • 若字幕文件为 .ass 格式,程序会自动提取纯文本内容,并忽略样式信息
  • 输出视频默认采用 H.264 + AAC 编码,兼容大多数平台
VA
@volc-ai-mediakit

已收录 1 个 Skill

相关推荐