关于 video-editing
这是一套 HyperFrames 剪辑流程,用于将已确认的脚本、配音或出镜素材及收集的资产制作成短视频。面向优先制作竖屏内容的剪辑者,涵盖风格设定、预览、检查、渲染和成片验证。
主要功能
- 01生成 HyperFrames 项目骨架
- 02按节拍剪辑并应用风格
- 03组合 A-roll 与 B-roll
- 04预览和代码检查流程
- 05渲染并验证 MP4
- 06编写交付剪辑报告
适用场景
- 01将提供的素材剪成竖屏短视频
- 02添加定时字幕和动态图形
- 03将风格包适配到不同画幅
- 04交付前验证渲染的 MP4
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ nopefallacy/ vertical-video-editing-skills --skill video-editing安装后在 Claude Code 中输入/video-editing确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
scripts/verify-render.mjsstyles/README.mdstyles/_template/FRAME.mdstyles/vibe-life/frame-showcase.htmlFRAME.mdREADME.html详细介绍
视频编辑
当你已获得经批准的脚本、提供的配音/出镜讲述素材和收集好的素材,并需要将它们制作成完整的竖屏(9:16)短视频时,请使用此技能。你是主剪辑师,而不是拼接片段的人。成片标准是创作者级短视频(Kallaway / Varun Mayya 的信息密度):每个节拍都要吸引观众注意力。千篇一律的 AI 工具产出——统一的 1s 切镜、默认字体、线性/抖动变换、套用模板的观感——都是失败,不能作为交付成果。
默认比例为 9:16(1080×1920)。风格包也定义了 16:9 和 1:1 的处理方式,因此同一种风格可以调整为其他画幅——但此技能的节奏和钩子表达方式首先是为竖屏短视频设计的。
不容妥协的工作流(绝不跳过或调整顺序)
从零开始手动编写 index.html 会破坏热重载和项目结构。务必按以下步骤操作:
- 在项目的
edit/文件夹中运行npx hyperframes init edit——创建项目脚手架(index.html、meta.json、hyperframes.json、CLAUDE.md、package.json)。 - 运行
cd edit,然后修改生成的项目文件,制作实际剪辑。添加fonts/、assets/sfx/和compositions/下的子合成。 - 运行
npx hyperframes preview(长时间运行——请在后台运行)——在浏览器中通过热重载进行验证。使用浏览器工具检查并截图。在渲染前确认节奏、布局、文本时机和动画流畅度。 - 运行
npx hyperframes lint/npm run check——修复所有错误,并检查警告。 - 运行
npx hyperframes render——生成最终 MP4。 - 验证:使用
ffprobe检查尺寸(9:16)、时长和编解码器;使用ffmpeg对照联系表抽查帧。运行随附的门禁脚本(见下文)。
使用 hyperframes 文档(npx hyperframes docs)查看 API/功能参考,并参照此技能中的参考资料遵循剪辑标准。如果 HyperFrames 工具缺失或损坏,请停止并告知用户,不要手动制作千篇一律的剪辑成品。
要求
- HyperFrames——渲染引擎,通过
npx hyperframes运行。此技能是在 HyperFrames 之上的剪辑标准,并非替代 HyperFrames。 - Node.js(用于
npx和验证脚本)。 - PATH 中需有 ffmpeg / ffprobe——用于合成音效、混合音频和验证渲染结果。
styles/<style>/FRAME.md下的风格包(此技能提供了完整示例vibe-life和可用作起点的_template——参见styles/README.md)。
输入
在一个项目文件夹中工作。建议的目录结构如下(可按需调整):
your-project/
├── script.md # approved script with beats/timestamps, supers, energy cues — THE SPINE
├── voiceover/ # provided voice / talking-head media (the A-roll)
├── avatar/ # optional talking-head media
├── assets/
│ ├── manifest.json # gathered B-roll + per-beat asset map + rights notes
│ └── ... # the gathered media
└── edit/ # YOUR output (created by `npx hyperframes init edit`)
阅读(不要编辑)脚本、配音/虚拟形象媒体和素材清单。选择视频要使用的风格包(styles/<style>/FRAME.md)。
输出
将所有内容写入项目的 edit/ 文件夹:
- HyperFrames 项目(
index.html+compositions/+fonts/+assets/sfx/+assets/master_audio.*)。 - 最终渲染并验证通过的 MP4(9:16)。
edit-report.md——交接说明:逐个节拍记录剪辑决策、使用的素材(附清单引用)、使用的音效/音乐、预览/渲染验证说明,以及需要最终审核的事项。模板见references/edit-report-template.md(附在下方)。
编辑规范(此处“专业”的含义)
以下每一项都是质量门槛,而非建议。
整体视觉语言采用编辑风格——参见下文“editorial-look”。画面应是经过设计的页面,而不是叠加文字的视频:混搭衬线斜体与粗体无衬线的编辑风格标题、纸面舞台和暗色网格转场背景、默认的 A-roll/B-roll 布局为上下堆叠分屏(上方 B-roll/下方出镜讲解)、带关键词颜色强调的高亮条字幕、分隔线字幕与姓名标签、标题卡片,以及 UI 卡片堆叠。每条短视频都应采用这十种模式,并按风格包进行主题化设计。
- **精心设计的开场钩子(前 1–3 秒):**首先叠加文字字幕,制造一个打断常规的瞬间,然后转入画面(例如,将分屏面板扩展为完整的 9:16 画面)。切勿以静止的出镜讲解画面开场。
- **A-roll / B-roll 结构:**A-roll(出镜讲解/旁白)是主干;B-roll(片段、截图、动态图形)用于覆盖和强调。应在 A-roll 的音频上切入 B-roll,不要留白。
- **剪辑粒度:**当脚本节奏需要时,单个镜头可短至 0.2 秒;绝不能机械地每 1 秒切一次。节奏应跟随脚本。
- **分屏布局:**采用并排和上下堆叠构图,并有意识地切入和切出全屏画面。带分隔线字幕的上下堆叠分屏是主力布局——全屏 B-roll 覆盖只是例外。
- 人脸安全构图:只要面板或裁剪画面中有人物,就应通过
object-position调整裁剪位置,使人脸位于面板可视区域中央,双眼处于上三分之一处——默认的50% 50%几乎总不适合出镜讲解素材,还会切掉头部。人物面板上的镜头移动必须确保整段移动过程中人脸始终在画面内。人脸偏离中心或被裁切即为不合格。参见“editorial-look”§4“人脸安全构图”。 - **平滑的镜头运动:**推近/拉远和向左/向右平移,必须始终使用缓动,不可线性运动,也不可抖动。参见“camera-moves”中的防抖规范。
- **动感文字/字幕:**采用动画入场、关键词强调(一个强调词),并让字幕叠字与语音同步。
- **主题化动态图形:**数字卡片、规格/JSON 卡片、边界框标注、海报式分屏、图表构建——应围绕风格主题设计,不能使用通用样式。
- **Logo/字标动画:**当脚本提及品牌或产品标志时,应为其添加动画。
- **音效:**在剪辑和图形强调处叠加呼啸声、点击声、渐强音、撞击声——效果应微妙,并混在语音之下。参见“sfx-and-audio”。
- **美学统一:**采用单一配色主题、统一的字体排版、平滑的运动曲线,不使用默认风格元素,不做突兀弹出效果。所有设计元素均来自风格包
FRAME.md。
风格主题化(设计前必须完成)
首先从风格包中提取视觉识别要素——颜色、字体、运动个性和图形语言均取自 styles/<style>/FRAME.md。**风格不同,视觉效果也必须不同。**参见下文“style-theming”,了解如何将 FRAME.md 转化为具体的 frame.md 设计规范(调色板令牌、本地字体的 @font-face、运动个性对应的缓动/剪辑选择)。随附的 vibe-life 示例采用奶油色/墨色/蜜桃色/黄油色调色板;Space Grotesk + Instrument Serif 斜体 + JetBrains Mono;纸艺剪切式运动(通过音效掩饰的硬切,而非交叉淡化);每帧一个置于胶囊标签中的衬线斜体强调词;纯色硬边墨色阴影。你自己的风格也应使用相同的设计要素,但替换为自身的令牌。
HyperFrames 硬性规则(违反这些规则会导致渲染失败)
- 每个带时间的元素都需要
data-start、data-duration、data-track-index以及class="clip"(框架通过clip控制可见性)。 - 绝不要对
.clip元素本身使用 GSAP——框架负责其可见性和变换。应为子级包装元素(例如.cam、.inner)添加动画。 - 时间轴必须是
gsap.timeline({ paused: true }),并注册到window.__timelines["main"](其 id 与data-composition-id一致)。 - 只能使用确定性内容——不得使用
Math.random()、Date.now()、网络请求或repeat: -1。渲染按帧采样,因此必须可复现。 - 9:16 = 1080×1920。 设置
#root { container-type: size; },让cqw/cqh相对于画面解析(1cqw = 10.8px)。尺寸、排版和图形使用cqw/cqh,不要使用vw/vh。 - 同一轨道上相邻片段不得相接——浮点精度会使
3.2 + 0.35 = 3.5500000000000003,与从3.55开始的片段重叠,并触发overlapping_clips_same_track。请留出间隔或使用0.34之类的时长。(采纳自 hyperframes-helper 的 lint 注意事项。) - 音频:视频使用
muted,并配有单独的<audio>元素。优先使用一条预混合的主音轨(通过 ffmpeg 的adelay+amix混合 VO + SFX),而不是多个<audio>元素——多条音轨会导致回声或不同步。将其放在较高的专用data-track-index上。 - 密度:
timeline_track_too_dense(单条轨道上有许多带时间的元素)对短期试播项目只是提示,但在大规模制作中确实会造成问题——正式制作时,将场景拆分为子合成(data-composition-src="compositions/file.html")。
工作流
- 以脚本为主线。 制作节拍图:每个节拍/时间戳对应 A-roll(VO/头像片段)+ B-roll/MG 需求 + 屏幕字幕 + 预期剪辑/镜头/转场 + 能量感。脚本的能量决定节奏;不要强加统一的韵律。
- 从样式包确定主题。 阅读
styles/<style>/FRAME.md。制定具体设计规范:调色板标记、本地@font-face声明、动效风格、图形语言。(参见“样式主题化”。) - 核对素材覆盖情况。 对照素材清单,确认哪些节拍已有收集的媒体素材、哪些需要
build-in-editor(由你制作动态图形)、哪些是alternate替换素材。最终渲染中绝不要放入占位或未获授权的媒体素材——在报告中标出缺口。 npx hyperframes init edit。 先搭建项目脚手架。然后添加fonts/(本地 woff2 子集)、assets/sfx/、compositions/。- 在
index.html中逐个节拍构建剪辑(较长内容使用子合成)。应用剪辑语法:精心设计的钩子、A-roll/B-roll 覆盖、非节拍器式剪辑、分屏、缓动镜头运动、动感文字、主题化 MG、Logo 动画。为子级包装元素添加动画,绝不要对.clip添加动画。 - 制作 SFX 和主音轨。 使用 ffmpeg(
anoisesrc/aevalsrc/sine)合成无版权限制的 SFX,或使用已获授权的素材;将 VO + SFX 混合为一条主音轨。(参见“音效与音频”。) - 预览并检查。 在后台运行
npx hyperframes preview;在浏览器中打开;截取关键节拍的屏幕截图;确认节奏、布局、文本时序和动作流畅度。渲染前先修复问题。 - Lint 检查。 运行
npm run check/npx hyperframes lint --verbose。修复所有错误并检查警告(注意已知的误报——例如在高对比度卡片隐藏的时间戳采样时出现的 WCAG 对比度警告)。 - 渲染。
npx hyperframes render→ MP4。 - 使用门禁脚本验证。 运行
node scripts/verify-render.mjs <path-to-mp4>——断言画面比例为 9:16、时长符合预期、编码为 h264/yuv420p,且包含音频。然后通过ffmpeg抽取帧并制作联系表,与预览画面逐一目视核对。 - 编写
edit-report.md并设置处理状态(done / in_review / blocked)。附上 MP4 和联系表。
运行验证门禁(此脚本随本文件一起提供,位于 scripts/verify-render.mjs):
node scripts/verify-render.mjs path/to/edit/<file>.mp4
也可选择断言精确规格:
node scripts/verify-render.mjs <file>.mp4 --duration 12 --tolerance 0.5
缺失素材
如果某个节拍需要的素材不在你的 assets/ 中:
- 先检查清单中是否有
alternate或build-in-editor行——自定义动态图形节拍由你来制作,不会因此受阻。 - 如果确实缺失,且能快速、合法地直接获取,请自行获取,并在
edit-report.md中记录来源。 - 否则,在报告中列出确切的节拍/时间戳、所需素材和预期的编辑操作,请用户提供素材,并继续完成你能完成的节拍。绝不要渲染你无权授权使用的占位素材。
验证(交付前必做)
- **预览截图:**从实时预览中截取具有代表性的画面,确认布局、时序和动态效果。
- **ffprobe:**尺寸必须恰好为 9:16(1080×1920),时长符合预期(允许 ± 误差),编码为
h264/yuv420p,并包含音频流。门禁脚本会执行这些检查。 - **帧抽查:**使用
ffmpeg从整个时间线中提取帧并制作联系表;确认每种必需的技法都以符合风格的方式呈现,并与预览一致。 - **面部检查:**在每张包含人物的预览截图和联系表帧中,整张脸都必须在画面板块内清晰可见并居中(不得被拼接线、字幕、边缘或镜头移动裁切)。如果未通过检查,则重新取景并阻止交付。
- **版权:**渲染中不得包含未经授权/占位媒体;需要最终版权检查的内容必须在报告中注明。
- **设计变更日志:**任何偏离风格规范或编辑风格布局模式的情况(新布局、颜色/字体变更、动态效果修改)都必须连同原因记录在
edit-report.md的「Design decisions」下。视觉变更可以接受;未经记录的视觉变更不可以。
致谢与来源
本技能参考了 hyperframes 文档、github.com/robonuggets/hyperframes-helper,以及来自专业创作者短视频的参考帧,并在此基础上进行了扩展。具体分类见下文的「standard-provenance」。摘要:
- 采用自 hyperframes-helper/HyperFrames:以 HTML 为事实来源的模型;
data-*时序属性 +class="clip";暂停的window.__timelines时间线;GSAPpower2/power3.out缓动;白色辉光字幕样式;SVG 下划线强调;lint 常见问题列表(重叠浮点精度、仅确定性内容、静音视频加音频等)。 - 新增:完整的缓动镜头运动系统,并明确规定防抖要求;9:16 短视频语法(精心设计的钩子、低于 0.2 秒且非节拍器式的剪辑、分屏→全画幅转场);从
FRAME.md到具体设计规范的风格主题化流程;免版权 SFX 合成 + 单一预混主音轨规范;以及渲染验证门禁(ffprobe 断言 + 联系表抽查)。
附录 — 参考库(内联)
创作源文件将这些内容保存在 references/ 下的独立文件中;此处将其内联,方便将该技能集中在一个自包含的 SKILL.md 文件中。
附录:editorial-look
编辑风格 — 视觉语法参考
从专业创作者短视频(Kallaway/Varun Mayya 级别)的静帧中提炼出十种命名模式。这些是标准布局:每条短视频都应基于这些模式制作,并使用你风格包中的标记(styles/<style>/FRAME.md)进行主题化。以下示例展示了如何应用于随附的 vibe-life 示例;请替换为你自己的标记。
核心理念:**画面是经过设计的页面,而不是叠加文字的视频。**字体采用编辑风格(厚重的无衬线字体与斜体衬线字体形成对比),媒体置于纹理背景上的卡片或面板中,字幕是排版设计的对象(色条、胶囊、下划线)——绝不是仅添加投影的裸文字。
1. 编辑风标题(衬线与无衬线混排)
一个标题,两种语气:陈述部分使用粗重无衬线字体,转折词语使用斜体衬线字体,并在重点处手绘下划线或高亮。
Claude Just *Changed* ← serif italic on the verb
SOCIAL MEDIA FOREVER ← heavy grotesque, tight leading
━━━━━━━━━━━━ ← accent underline (brand accent)
.headline { text-align: center; line-height: 0.95; color: var(--fg); }
.headline .sans { font: 500 9cqw/0.96 "Space Grotesk"; letter-spacing: -0.32cqw; }
.headline .serif { font: italic 400 9cqw/0.96 "Instrument Serif"; }
.headline .underline {
display: block; width: 46cqw; height: 0.9cqw; margin: 1.6cqw auto 0;
background: var(--accent-strong); border-radius: 999px;
transform-origin: left center; /* animate scaleX 0→1, power3.out */
}
规则:斜体衬线字体最多用于一两个词(动词或转折词),绝不用在整行文字上。文字落定后,下划线通过 scaleX 绘制出来。衬线字体使用混合大小写,与全大写或标题式大小写的无衬线字体搭配,是这一风格的标志。
2. 纸面舞台(带浅纹理的底色)
全画面铺满带淡淡网格的米白色「纸张」,媒体内容和图形以卡片形式放在纸面上。用于开场钩子、Logo 镜头和 UI 堆叠镜头。
.paper {
background:
linear-gradient(var(--line-faint) 1px, transparent 1px),
linear-gradient(90deg, var(--line-faint) 1px, transparent 1px),
var(--bg); /* e.g. #f3ecd9 */
background-size: 6cqw 6cqw, 6cqw 6cqw, auto;
}
/* --line-faint: color-mix(in srgb, var(--fg) 7%, transparent) */
可选颗粒效果:使用确定性的 SVG feTurbulence data-URI,透明度为 4–6%(固定种子——渲染结果必须可复现)。切勿使用循环播放的视频纹理。
3. 深色网格转场页(排版章节卡)
全画面铺满墨色背景,显示网格,居中呈现混合排版的主张,并点亮一个强调色网格单元——作为章节之间打破排版常规的转场。停留 0.6–1.2s。
.grid-wall {
background:
linear-gradient(rgba(255,255,255,0.07) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.07) 1px, transparent 1px),
#121110;
background-size: 4.5cqw 4.5cqw;
}
.grid-wall .cell { /* the single accent pixel */
position: absolute; width: 4.5cqw; height: 4.5cqw;
background: var(--accent-strong); filter: blur(0.15cqw);
}
墙面文字遵循模式 1(上方为小号斜体衬线文字,中间为粗重无衬线主张,下方为斜体衬线收尾文字,并向右错开,边缘参差)。少量网格单元可以闪亮——对 2–4 个单元的 opacity 设置交错的确定性动画。
4. 上下分屏(主力版式)
上方为 B-roll 画面(约 52–56cqh),下方为人物对镜画面,字幕位于两者交界处。这是默认的 A-roll/B-roll 版式——全画面 B-roll 才是例外,而非常规做法。
<div class="stack">
<div class="panel top"><video class="fill" ...></video></div>
<div class="seam-caption">For <em>13 years</em></div>
<div class="panel bottom"><video class="fill" ...></video></div>
</div>
.stack .panel { position: absolute; left: 0; right: 0; overflow: hidden; }
.stack .top { top: 0; height: 54cqh; }
.stack .bottom { bottom: 0; height: 46cqh; }
.seam-caption {
position: absolute; top: 54cqh; left: 0; right: 0; z-index: 2;
transform: translateY(-50%); text-align: center;
}
进出全画面的动效要有意设计:让一个画面板扩展至完整的 9:16 画面(在面板容器上为 height/y 添加 power3.inOut 动画,时长为 0.45–0.6s,并在动效期间加入 whoosh 音效),或者让上方面板滑出、由下方面板接管。面板也可以放在深色网格框架内(边缘露出模式 3 的底色),营造高级的「装裱」效果。
面部安全构图(画面板中出现人物时必须遵守)
画面板会裁切源视频,而默认裁切位置(object-position: 50% 50%)会切掉头部,或把脸挤到角落。**脸必须位于面板可见区域中央,双眼处于上方三分之一处。**交界线、字幕或面板边缘绝不能裁切人脸。
.panel video.fill { width: 100%; height: 100%; object-fit: cover; }
.panel.bottom video.fill { object-position: 50% 22%; } /* bias crop toward the face */
操作步骤:
- 确定脸在源片段中的位置(预览一帧;9:16 的人物对镜源视频中,脸通常位于画面顶部往下约 20–35% 处)。
- 为每个面板设置
object-position: 50% <face-y>%,让脸落在面板中部。展示 9:16 源视频的 46cqh 下方面板需要调整 y 偏移——50% 50% 几乎总是错误的。 - 如果面板窄于全宽(左右分屏),也要朝脸的方向调整 x 偏移。
- 人物面板上的镜头运动必须确保脸在整个运动过程中都位于可见区域内——检查结束姿势,而不只是开始姿势。
- 在预览截图和渲染联系表中再次确认:每一帧中出现的人物,其整张脸都完整显示在面板中央。人脸偏离中心或被裁切属于验收失败,严重程度与画面抖动相同。
5. 高亮条幅大字(框内陈述)
大字必须放在实色条幅内,可使用一条或上下堆叠的两条,关键词使用强调色。可采用黑底白字(报纸风)或强调色条幅。
.bar-super { text-align: center; }
.bar-super .bar {
display: inline-block; padding: 0.8cqw 3cqw;
background: var(--fg); color: var(--bg); /* ink bar */
font: 500 7.4cqw/1.18 "Space Grotesk"; letter-spacing: -0.2cqw;
box-decoration-break: clone; -webkit-box-decoration-break: clone;
}
.bar-super .bar.accent { background: var(--accent-strong); } /* accent bar variant */
.bar-super .kw { color: var(--butter); } /* keyword pop inside the bar */
两行条幅错开入场(第二条比第一条晚 0.08–0.12s 落定,y: 30 → 0,使用 power3.out)。数字使用关键词颜色:**1** out of 3 employees。
6. 姓名胶囊 / 交界胶囊
用于标明画面中的人物或事物的小型圆角胶囊,也可在面板交界处呈现衬线强调词。以 scale: 0 → 1, back.out(2) 动画入场,配合点击音效,在当前节拍内停留,并在面板切换前退出。
7. 标题卡片(报纸专题)
用于新闻/公告专题的“剪报”:衬线标题上方有一条墨迹高亮条,突出关键短语;下方是照片剪影,中间以锯齿分隔线(闪电形 SVG 路径)隔开,整体置于纸张画布上。
.clipping h1 { font: italic 400 6.4cqw/1.15 "Instrument Serif"; color: var(--fg); }
.clipping h1 mark { background: var(--fg); color: var(--bg); padding: 0 1cqw; }
.clipping .photos { display: grid; grid-template-columns: 1fr 1fr; gap: 0.6cqw; }
按逐步呈现的方式制作动画:标题以逐字显示或滑入的方式出现,高亮 mark 从左侧起点擦入(scaleX,原点在左侧),照片依次落下,间隔 0.1s,并配合分隔线闪现。
8. UI 卡片堆叠(收据)
将真实截图(个人资料、帖子、仪表板、JSON)以圆角卡片堆叠的形式呈现,卡片带边框和阴影,置于纸张画布上——让证据清晰呈现。卡片依次进入(y 轴偏移 + 依次延迟 0.1–0.14s,power3.out),略微重叠,相邻卡片交替旋转 ±1–2°。下方以粗体无衬线字体显示一个简短单词(“connect”)。
9. 带光晕/描边的展示文字(少量使用)
用于 B-roll 上的单个煽动性词语:上方以较小字号显示手写体/衬线词语,下方以粗体大写字母显示大词,后方叠加一个带描边光晕的副本(使用 -webkit-text-stroke + 强调色的柔和 text-shadow)。每条短视频最多使用一次——这是整套设计中最醒目的元素。
10. 接缝字幕
字幕放在版面接缝处(堆叠面板之间),或显示在主持人画面上方的遮罩带中——用强调色或纸张色显示简短的衬线斜体短语(For 13 years、order sunlight)。每次只显示一个短语,并与旁白分句同步淡入或上移 20–30px。不要使用段落字幕;这种风格中也不要使用整句卡拉 OK 字幕。
构图规则(如何组合这些样式)
- 每一帧都必须有视觉依托:纸张画布、深色网格或铺满边到边的媒体面板。原始视频上不能直接悬浮文字,必须配有遮罩、条带或胶囊框。
- 开场钩子配方(参考 1、3、5):在纸张画布上或顶部面板上放置编辑风格标题(样式 1)→ 堆叠分屏(4),主持人从底部面板进入 → 接缝胶囊框(6)→ 正文开始时,让一个面板扩展至全屏。
- 章节转场使用深色网格过渡画面(3)或标题卡片(7)——主题之间绝不能直接裸切。
- 强调层级(由弱到强):接缝字幕(10)→ 姓名胶囊框(6)→ 高亮条(5)→ 编辑风格标题(1)→ 光晕文字(9)。选择能达到目的的最低层级;不要在同一帧中叠加两种强烈样式。
- 样式映射是强制要求:参考画面中的红色/黄色代表的是功能角色(强强调色/重点色),不是要照搬的颜色。请从你自己的
FRAME.md中选取颜色来承担相同角色。 - 所有入场动画都必须遵守防抖规范(“camera-moves”);每条条带/胶囊框/卡片落位时,都要在旁白下方添加咔嗒声或闷响(“sfx-and-audio”)。
附录:样式主题化
样式主题化 — FRAME.md → 具体设计规范
在开始设计之前,先将样式包中的 styles/<style>/FRAME.md 转换为具体、可用的剪辑设计规范。**样式不同,视觉效果也必须不同。**切勿交付通用主题。
从 FRAME.md 中提取的内容
-
调色板 → CSS 自定义属性。 提取所有命名颜色,并在
:root上定义令牌,让每个场景都引用同一事实来源::root { --cream: #f4efe6; --ink: #1a1714; --peach: #f2a07a; --butter: #f5cf6a; --moss: #8a9b6e; --sky: #8fb3c4; --plum: #9a7aa0; } -
字体排版 → 本地
@font-face。 渲染必须确定且离线可用 — 渲染时绝不依赖字体 CDN。 将 woff2 子集下载到fonts/,并在本地声明:@font-face { font-family: "Space Grotesk"; src: url("fonts/spacegrotesk.woff2") format("woff2"); } @font-face { font-family: "Instrument Serif"; src: url("fonts/instrumentserif.woff2") format("woff2"); font-style: italic; } @font-face { font-family: "JetBrains Mono"; src: url("fonts/jetbrainsmono.woff2") format("woff2"); }为每个字体系列获取拉丁文子集中的最大 woff2 文件(文件太小通常意味着子集有误或不完整)。将每种字体映射到对应角色:标题使用展示型无衬线字体,强调词使用斜体衬线字体,规格/数字/代码卡片使用等宽字体。
-
动态个性 → 缓动与切换风格。 FRAME.md 描述了风格的动态表现。 将其转化为动画:
- “剪纸 / 平静” → 以音效遮掩的硬切,而非交叉淡化;使用
power1.inOut缓动漂移;主线动画中不使用弹跳的back/elastic。 - “活力 / 强劲” → 更快的切换,使用
power3.out进场,偶尔用back.out点缀。 通过让转场保持风格(硬切),同时让节奏(切换频率)承载能量,协调平静的个性与短视频的活力。
- “剪纸 / 平静” → 以音效遮掩的硬切,而非交叉淡化;使用
-
图形语言 → MG 配方。 将 FRAME.md 中的标志性设计元素变成可复用的动态图形:例如,每帧一个放在强调色胶囊中的斜体衬线强调词;平面硬墨色阴影(纯色偏移,绝不模糊);纸面背景上的数字/账本卡片。
frame.md 设计规范(首选小写)
HyperFrames 倾向于使用小写的 frame.md 作为每个项目的设计规范。在
edit/ 中创建一个文件,记录令牌调色板、三种字体角色、动态个性决策以及将复用的图形元素。这能让每个场景保持协调,并为下一位编辑提供一份统一参考。
确保保真度的容器单位
设置 #root { container-type: size; },并使用 cqw/cqh 设置文字和图形尺寸(1080 宽时,1cqw = 10.8px)。这样可确保预览和渲染的比例完全一致,并让间距平滑缩放。避免使用 vw/vh — 它们相对于视口计算,而非画面。
附录:camera-moves
镜头运动与抗抖动约定
HyperFrames 通过将 GSAP 时间轴暂停在采样帧时刻并截取屏幕图像来渲染。实时预览中看起来正常的镜头运动,如果变换没有提升到 GPU 且无法保持亚像素稳定,在渲染结果中就可能出现卡顿或闪烁。这是“AI 工具输出”和创作者级成品之间最大的差距。hyperframes-helper 没有镜头系统 — 此功能由本技能添加,且为必需项。
规则
-
绝不为
.clip元素添加动画。 框架负责其可见性和基础变换。应在 clip 内部放置.cam包装元素,并为其添加动画。<div class="clip" data-start="5.0" data-duration="2.6" data-track-index="1"> <div class="cam"> ... scene content ... </div> </div> -
将移动图层提升到 GPU,让合成器(而非布局引擎)处理变换 — 这是消除抖动的关键:
.cam { will-change: transform; backface-visibility: hidden; transform: translateZ(0); /* forces its own compositor layer */ } -
在补间上强制启用 3D,让 GSAP 写入
matrix3d,而非matrix:gsap.set(".cam", { force3D: true }); -
使用缓动,绝不使用线性。 线性镜头运动看起来像机器人。缓慢漂移使用
power1.inOut,进场使用power2.out/power3.out。expo/back仅用于点缀,不用于基础镜头运动。 -
保持幅度较小。 推近应在 2–3 秒内从
scale 1.0 → 1.12,平移应为xPercent ±1.5— 而不是±20。幅度大、速度快的运动会加剧采样抖动,显得廉价。 缓慢、细微、平滑缓动。 -
设定缩放锚点。 有意设置
transform-origin(center,或朝向主体),让缩放推向兴趣点,而不是偶然地以几何中心为目标。
模式
缓动推近:
tl.set("#s4 .cam", { force3D: true });
tl.fromTo("#s4 .cam",
{ scale: 1.0, xPercent: -1.5 },
{ scale: 1.12, xPercent: 1.5, duration: 2.6, ease: "power1.inOut" },
5.0
);
向左/向右平移: 仅为 xPercent 添加动画,幅度较小,使用 power1.inOut。搭配微小的 scale: 1.04,避免边缘露出画面边界。
分屏 → 扩展至全画幅: 面板从半幅(width: 50cqw)扩展至全幅(100cqw),使用 power3.out,同时相邻面板滑出。这是“角色扩展至完整 9:16 画幅”的吸引点动作——缓动到位,并用剪切处的呼啸音效掩盖。
在渲染结果中验证运动,而不只是预览
实时预览会平滑插值;渲染则采样离散帧。渲染后,用 ffmpeg 在镜头运动过程中提取 3–5 帧,并检查:文字边缘是否闪烁、是否有亚像素抖动,以及开始/结束处是否有“跳变”(通常是缺少 fromTo 起始状态,或对片段而非包装器添加了动画)。
附录:音效与音频
音效与音频 — 合成及单一主音轨规范
音效能让创作者级剪辑区别于无声幻灯片:镜头运动时加入呼啸声,文字出现时加入点击声,揭示内容前加入渐强音,图形冲击时加入撞击声——全部都要细腻,并混在旁白之下。 两个棘手的问题:获取免版税音效,以及避免多个音频元素导致回声/不同步。
通过 ffmpeg 合成免版税音效
无需许可,也无须担心来源问题——确定性地合成音效。将每个音效生成到 assets/sfx/:
呼啸声(剪切/镜头运动)——经过滤波的粉红噪声,带快速包络:
ffmpeg -f lavfi -i "anoisesrc=duration=0.45:color=pink:sample_rate=48000:amplitude=0.5" \
-af "afade=t=in:st=0:d=0.05,afade=t=out:st=0.2:d=0.25,highpass=f=300,lowpass=f=6000" \
assets/sfx/whoosh.wav
注意:始终将 lavfi 参数加引号。命令中其他位置未加引号的
*可能会展开为匹配文件,并改变 ffmpeg 的位置参数,导致错误解析r=$SR等内容。
点击声(文字/UI 出现)——短促的高频正弦波提示音:
ffmpeg -f lavfi -i "sine=frequency=2200:duration=0.04:sample_rate=48000" \
-af "afade=t=out:st=0.01:d=0.03" assets/sfx/click.wav
渐强音(揭示内容前的铺垫)——通过 aevalsrc/sine 和频率渐变生成上升扫频,时长约 0.6–1.0s,并淡入。
撞击声(图形冲击/落点)——低频正弦波(约 80–120Hz)+ 短促噪声爆发,快速衰减。
音效音量应比旁白低 −18 至 −12 dB。它们用于点缀,而非抢戏。
使用一条预混合主音轨(而非多个 <audio> 元素)
多个同时播放的 <audio> 元素会导致渲染时产生回声、漂移和不同步。应改为离线使用 ffmpeg 将旁白 + 所有音效混合成一条主音轨,通过 adelay 将每个音效放在对应的剪切时间点,然后使用 amix:
ffmpeg \
-i voiceover/vo.wav \
-i assets/sfx/whoosh.wav -i assets/sfx/click.wav -i assets/sfx/riser.wav -i assets/sfx/impact.wav \
-filter_complex "\
[1]adelay=2200|2200,volume=0.5[w]; \
[2]adelay=3200|3200,volume=0.4[c]; \
[3]adelay=7000|7000,volume=0.45[r]; \
[4]adelay=7600|7600,volume=0.6[i]; \
[0][w][c][r][i]amix=inputs=5:duration=longest:normalize=0[mix]" \
-map "[mix]" -ar 48000 -ac 2 assets/master_audio.wav
adelay 的单位是每声道毫秒数(立体声使用 ms|ms)。normalize=0 可防止混音器降低旁白音量。然后将音频编码为 .m4a(AAC)用于渲染,并在专用的高 data-track-index 上通过单个 <audio> 元素引用该文件:
ffmpeg -i assets/master_audio.wav -c:a aac -b:a 192k assets/master_audio.m4a
<audio class="clip" data-start="0" data-duration="12" data-track-index="9"
src="assets/master_audio.m4a"></audio>
视频保持 muted;如果视频含有音频,也要预先混入主音轨。主音轨长度应与合成时长一致,以通过门控脚本的音频和时长检查。
附录:剪辑报告模板
edit-report.md 模板
将此模板写入项目的 edit/edit-report.md。这是从剪辑师交接给审核者的文件。填写每个部分;不要留下占位符。
# Edit report — {project}: {title}
**Disposition:** done | in_review | blocked
**Output:** edit/{file}.mp4 — {WxH}, {duration}s, {codec}, audio {present/absent}
**Style:** {style} (theme from styles/{style}/FRAME.md)
## Beat-by-beat edit decisions
| Beat / ts | A-roll | B-roll / MG | Cut & camera | On-screen super | SFX |
|-----------|--------|-------------|--------------|-----------------|-----|
| S1 0–2.2s | VO hook | — | kinetic text in | "..." (accent word) | click |
| ... | | | | | |
## Assets used
- {manifest file} → beat {S#}: {how used in the cut}. status: {gathered/alternate}.
- Built-in-editor MGs: {list} (no stock equivalent — designed on the style theme).
- Self-fetched (if any): {file} ← {source URL}, {tool}, {license}.
## Audio
- Voiceover: {voiceover/file}
- SFX: {list} — synthesized via ffmpeg (rights-free) | cleared asset {provenance}
- Mixed to single master: assets/master_audio.m4a ({duration}s, 48kHz stereo)
## Design decisions
- {any deviation from the style spec or editorial-look patterns: what changed, why.
"None" if the edit is fully on-pattern.}
## Verification
- Preview: {beats screenshotted; pacing/layout/timing confirmed}
- Face check: {every person-frame shows the whole face centered in its panel — confirmed}
- Lint: {errors fixed}; warnings: {list + which are known false positives and why}
- ffprobe: {WxH} / {codec} / {fps} / {frames} / {duration} / {audio}
- Frame spot-checks: contact sheet at {path}; all required techniques render on-style.
- Gate script: PASS
## Rights flags
- needs-final-review: {assets, if any — confirm a license before publish}
- missing: {NONE in render — listed here if a beat still wants an official file}
## Gaps / next steps
- {anything deferred, any follow-up needed from the user}
保持内容清晰易读:写明决策和依据,而不是叙述过程。如果遇到阻碍,处置说明和问题部分必须明确指出阻碍及下一步行动。
附录:标准来源说明
标准来源说明 — 采用与新增内容
记录这些信息,以便阅读此技能的任何人都能了解哪些是沿用的惯例,哪些是此处新增的内容。
研究来源
- hyperframes 文档(
npx hyperframes docs、llms.txt索引)。 - github.com/robonuggets/hyperframes-helper — 一个 HyperFrames 辅助仓库。
- 创作者级短视频的参考静帧(Kallaway / Varun Mayya 级别)。
已采用(行业/框架惯例 — 原样复用)
- HTML 事实来源合成模型;使用
data-start/data-duration/data-track-index/data-media-start设置时间;使用class="clip"控制框架可见性。 - 在
window.__timelines["<composition-id>"]上注册暂停的 GSAP 时间线; 仅限确定性操作(不得使用 random/now/fetch/repeat:-1)。 - GSAP 缓动术语 — 入场使用
power2.out/power3.out,漂移使用power1.inOut。 - 字幕样式 — 白色文字搭配柔和的发光/描边,确保在任何素材画面上都清晰易读;使用 SVG 下划线突出关键词。
- Lint 易踩坑清单 — 尤其要注意浮点精度导致的
overlapping_clips_same_track陷阱、将视频设为muted并使用单独的<audio>,以及自属性选择器警告。
此处新增(超出 hyperframes-helper 的内容)
- 带缓动的摄像机运动系统,并明确规定防抖契约
(
will-change/backface-visibility/translateZ(0)/force3D、动包装层而非片段、幅度较小并带缓动、在渲染结果中验证)。hyperframes-helper 完全没有摄像机系统。 - 9:16 竖屏短视频语法。 hyperframes-helper 仅支持 16:9。此技能定义了原生竖屏的精心设计钩子、分屏→全画面转场,以及最低可达 0.2s 的非节拍式剪辑,并根据脚本的能量变化调整。
- 风格主题化流程:
styles/<style>/FRAME.md→ 具体的frame.md设计规范(调色板令牌、用于离线确定性渲染的本地@font-face、运动个性 → 缓动/剪辑映射、图形元素)。 - 音效合成 + 主音轨规范: 使用 ffmpeg 合成免版税音效,并预混成单条主音轨,避免多个
<audio>造成回声/音画不同步。 - 渲染验证关卡:
scripts/verify-render.mjs— ffprobe 断言(9:16、时长±容差、h264/yuv420p、存在音频),以及联系表帧抽查。将“预览看起来没问题”变成硬性、可脚本化的验收检查。 - 容器单位保真度: 在
#root上设置container-type: size,并使用cqw/cqh尺寸单位,确保预览与渲染在 1080×1920 下完全一致。