Skip to content

HyperFrames:素材、二次编辑与透明包装轨道 ​

HyperFrames 适合制作字幕条、角标、片头、动态图表、3D 产品动画等视频包装,再与主视频组合。 它以 HTML composition + CSS / JavaScript + 素材文件描述画面,通过浏览器逐帧渲染、FFmpeg 编码与混音输出视频。JSON 可以提供配置、变量和资源描述,但不是与任意视频草稿通用的工程格式。

本文的 Hyperframe 指 HeyGen 的开源项目 HyperFrames。 核对日期:2026-09-30;依据官方仓库 快照 efd3c51ac9b7, 该快照的 CLI / Producer 包版本字段为 0.8.94。以下“上游支持”来自文档与源码审阅, 本次未运行 HyperFrames 渲染,也不将主分支版本字段当作 npm 发布状态证明。

当前集成状态

本仓库是基于 React、Mediabunny、WebCodecs、PixiJS 等开源技术构建的编辑学习 Demo, 目前未依赖或接入 HyperFrames。本文提供能力说明与接入设计;现有编辑器尚不具备 HyperFrames 工程导入、草稿转换或透明包装轨道的完整链路。

能力速查 ​

问题上游能力及适用条件对本项目的含义
源文件是 HTML 还是 JSON?画面与时序的主要源文件是 HTML;JSON 用于配置、变量等辅助数据保存完整工程目录,不能只保留导出视频或一个 JSON
audio / video 能作为素材吗?支持 HTML 音视频元素、入点、时长、速率、音量与混音可以把其他草稿先渲染为视频,再放进 composition
字体、CSS、JS 能一起使用吗?支持网页字体、样式和脚本;动画必须可按时间求值字体与依赖需要随工程固定,避免换机器后失效
Three.js / WebGL 呢?有 three 时间适配器,也有 WebGL 特效实现3D 场景作者负责按指定时间更新与绘制
WebGPU 呢?有 TypeGPU / 原生 WebGPU 适配器依赖实际渲染环境的 GPU、浏览器和异步完成同步
可以二次编辑吗?源码、Studio 支持的画布/时间线操作、模板变量均可修改任意 JS 内部状态不会自动变成可视化编辑参数
可以导出透明视频吗?已支持 WebM VP9、MOV ProRes 4444,以及透明 PNG 序列本项目还需接入、验证透明解码、代理、合成与输出

工程文件与可编辑性的边界 ​

一个可交接的工程可以按下面的方式组织;styles/、scripts/ 是组织建议,不是必需目录:

text
overlay-project/
  index.html                 主 composition:布局、时间与素材引用
  hyperframes.json            CLI 资源库和目录配置
  compositions/              可复用的子 composition
    lower-third.html
  assets/                    视频、音频、图片、字体、模型、纹理
  styles/                    CSS(可选,也可内联)
  scripts/                   JS / 模块(可选,也可内联)
  variables.json             模板参数输入(可选,自定义文件名)

hyperframes.json 的官方用途包括 registry 与 blocks/components/assets 路径配置, 不是完整时间线草稿。变量 JSON 可以通过 --variables-file 传入;composition 需要声明 变量并将它们绑定到 DOM、样式或脚本。Lottie JSON 是另一类动画资源,也不等于整个工程。 参见官方 composition 概念、 CLI 配置和 变量机制。

二次编辑应保留 HTML、样式、脚本、原始素材、字体、参数、依赖版本与输出规格。 Studio 对支持的布局、文字、媒体、时序和动画操作回写同一份项目文件;复杂 shader、 自定义 JS 或程序化 3D 结构仍需源码编辑。导出的 MP4/WebM/MOV 已经是像素与声音, 不会携带可恢复的文字图层、关键帧或 Three.js 场景树。 参见官方 源码与 Studio 编辑说明。

支持哪些素材与 Web 能力 ​

这里的“支持”表示有接入方式,不代表所有扩展名、编码组合和运行环境均已通过验证。

类型使用方式与能力生产使用约束
静态图片 / SVG<img>、内联 SVG、CSS 背景;适合 Logo、图标、贴纸保留透明图片原始 alpha;动图需要另行核对逐帧时序
Video<video src="…">;官方 Studio 接受 MP4、WebM、MOV容器不等于编码;预览解码与 FFmpeg 渲染都要验证。MOV 不代表浏览器能原生播放任意 ProRes
Audio<audio src="…">,以及视频中的源音频;用于配音、音乐、音效MP3/WAV 等常用音频仍需在目标环境检查;不要把任意 Web Audio 实时输出视作自动导出音轨
Font@font-face 加载字体文件,例如 WOFF2 / TTF字体随工程交付,检查中文字形覆盖;布局测量和捕获须等待字体加载完成
CSS布局、渐变、遮罩、滤镜、变换及受运行时控制的 CSS 动画受 Chromium CSS 实现影响;必须检查最终分辨率与导出画面
JavaScript脚本、ES module、GSAP 等;可生成 DOM / Canvas / SVG固定依赖版本、初始数据和随机种子,加载完成后再捕获
LottieLottie 动画及其 JSON / 图片资源,通过适配器求值保留关联资源,验证选定 Lottie renderer 与效果支持
Three.js / WebGLThree 场景、相机、模型、材质、shader;three 适配器提供时间Three.js 需自行加载;GLTF、纹理等由相应 loader 处理,框架不会自动把模型变成编辑器轨道
TypeGPU / WebGPUWGSL、计算与渲染管线;typegpu 适配器提供时间和完成屏障需要可用 GPU adapter;预览能运行不代表 headless / Docker 环境可用

依据:官方 媒体指南、 图片与视频、 音频指南、 帧适配器,以及 字体处理说明。

媒体时间与合成时间 ​

HTML 的 data-start、data-duration 描述片段在时间线上的位置;媒体源入点使用 data-media-start。例如把另一份草稿的成片第 4–10 秒放到本 composition 第 2–8 秒:

html
<!-- 放在已有 composition 内;片段静音,配音交给单独音频层 -->
<video
  class="clip"
  src="assets/other-draft.mp4"
  data-start="2"
  data-duration="6"
  data-media-start="4"
  data-track-index="0"
  muted
  playsinline
></video>
<audio
  src="assets/voice.wav"
  data-start="2"
  data-duration="6"
  data-media-start="0"
  data-volume="1"
></audio>

这是结构示例,不是已渲染样片。实际工程还需设置 composition 尺寸、总时长与布局。 上游当前不同读路径对 data-playback-start / data-media-start 的处理有差异: 视频、音频使用 data-media-start,嵌套 composition 使用 data-playback-start, 以免发生画面裁剪而音频仍从源文件开头播放的问题。不要用脚本同时控制媒体播放头, 应让运行时根据声明的时序驱动。参见官方 HTML 媒体契约。

Three.js / WebGPU 的关键是可 Seek ​

逐帧导出要能回答“时间 t 的画面是什么”,不能依赖页面运行了多久。 Three.js 可在 hf-seek 中使用 event.detail.time 设置旋转、相机或 mixer.setTime(t), 然后主动绘制。WebGPU 提交命令后,还需同步注册 event.detail.waitUntil(device.queue.onSubmittedWorkDone()),让捕获等待 GPU 工作完成。 Three / TypeGPU composition 应显式声明 data-duration;不能假设框架能推断任意脚本的时长。

避免用 Date.now()、未固定种子的随机数、每帧累加速度或自由运行的动画循环决定导出状态。 粒子模拟、物理、时间累积后处理若依赖历史帧,需要确定性重放或缓存策略,不能直接从任意 t 读取相同结果。模型、纹理、字体和 shader 初始化完成后才能开始捕获。

WebGPU 必须检测 navigator.gpu 和实际 adapter;必需 WebGPU 的 composition 可声明 data-requires-webgpu,使不满足条件的渲染明确失败。WebGPU 与实验性 HTML-in-Canvas 组合有额外浏览器要求,应独立验证。CLI 的 --browser-gpu 控制浏览器 GPU, --gpu 控制 FFmpeg 硬件编码,两者不是同一个开关。

依据:上游 Three.js 适配说明、 WebGPU 适配说明和 确定性渲染。

与其他视频草稿如何互通 ​

路径可以继续编辑什么需要付出的代价
保留或嵌套 HyperFrames 源工程原 HTML、文字、布局、动画代码、变量与素材管理子 composition、依赖、资源路径和局部时间
将其他草稿转换为 HyperFrames转换器覆盖的轨道、入出点、位置、文字与效果必须编写草稿 schema → HTML / 动画的转换器,逐项处理不支持的语义
其他草稿先导出视频,再作为 <video> 导入整段裁剪、变速、位置、透明度、叠加包装原草稿内部图层已经合并,不能恢复为可编辑对象
HyperFrames 导出为一层素材轨道本编辑器中的片段时间、变换、合成与音量改包装内文字或动画时,返回源工程修改并重新渲染

剪映 / Premiere / After Effects / 本项目 Project JSON 等工程并不会因为“也是 JSON 或有时间线” 而自动互通。本次核对未发现通用的任意 NLE 草稿导入契约,应按目标格式开发转换器。 转换时至少明确时间单位(本项目使用微秒)、帧率、源入点、速率、轨道顺序、裁剪、锚点、 字体和混音;无法映射的转场或特效应给出损失报告,必要时将该段预渲染。

建议本项目先采用“保留源工程 + 预渲染包装轨道”的方式:

轨道素材建议记录源工程位置、入口 HTML、参数快照、内容 hash、渲染器版本、尺寸、帧率、 时长及 alpha 约定。这些是本项目拟新增的元数据,不是现有 schema 或 HyperFrames 通用草稿标准。重新渲染后替换素材引用,保留轨道位置与外层变换;时长变化需重新核对裁剪边界。

渲染可运行在独立的本地服务或服务端 Worker 进程中;Producer 依赖 Node、Chrome / Chromium 和 FFmpeg,并非可以直接塞进当前浏览器 Media Worker 的纯前端库。

透明背景输出:上游已具备能力 ​

透明导出保存的是逐像素 alpha,适合字幕条、Logo 动效、粒子或装饰包装。 将轨道整体 opacity 调低、输出黑背景或把文件后缀改成 .webm 都不等价于保留 alpha。

交付格式上游编码 / 像素格式透明与声音适合的用途
MP4常规 H.264 yuv420p;另有 HDR 路径该导出路径不保留 alpha;AAC包装与主视频合成后的最终成片
WebMVP9 yuva420p连续 alpha;OpusWeb 包装视频;仍需验证接收端透明解码
MOVProRes 4444 yuva444p10le连续 alpha;AAC专业剪辑软件的中间素材;通常体积较大
PNG 序列RGBA PNG无损 alpha;音频另存旁路文件alpha 验证基准、后期处理、逐帧合成

上游另有 GIF / HLS 输出;GIF 只有二值透明,无法保留柔和半透明边缘;当前 HLS 路径不保留 alpha。 ProRes 的编码像素格式不表示网页捕获凭空获得了高位深画面信息。 PNG 序列不是单个视频文件,交接时必须携带帧率、帧序号与音频;README 与源码中的音频旁路 文件名描述存在差异,接入应以实际运行结果为准,不硬编码文件名。

依据:Producer 透明输出说明、 编码实现及 RenderConfig 契约。

导出操作示例 ​

以下命令在已经准备好的 HyperFrames 工程目录执行,需要对应 CLI、Chromium 和 FFmpeg。 本仓库没有安装这些依赖;示例根据上述快照核对,尚未在本机执行。实际接入时应锁定并验证所用版本。

bash
npx hyperframes lint
npx hyperframes check
npx hyperframes render --format webm --output renders/overlay.webm
npx hyperframes render --format mov --output renders/overlay.mov
npx hyperframes render --format png-sequence --output renders/overlay-frames

也可通过 Producer 的 createRenderJob({ inputPath, outputPath, format: "webm", ... }) 和 executeRenderJob(job) 集成渲染任务。应显式传递 format,不要仅依赖扩展名。 官方 CLI 渲染参数与 Studio 导出面板给出了两种操作入口。

画面透明需要满足的条件 ​

  1. 场景没有被填满。 上游透明捕获会覆盖 html、body、[data-composition-id] 的背景, 但内部铺满画面的 div、图片或视频仍会遮住背景。需要保留的卡片底色应放在内部元素上。
  2. Canvas 自身保留透明。 Three.js 使用允许 alpha 的 renderer,并清屏为透明; WebGPU 需要透明的 canvas 配置、清屏 alpha 和正确的预乘约定。仅改 CSS 无法消除 canvas 内的黑底。
  3. 中间处理保留 RGBA。 截图、滤镜、shader、合成、缓存和编码都不能提前填底或丢弃 alpha。 HDR + alpha 在该上游路径不受支持,会回退 SDR;Linux 的 BeginFrame 路径不保留 alpha, 上游为透明输出选择其他捕获路径,不能套用普通 MP4 的性能结论。
  4. 接收端也读得出 alpha。 Safari 的 WebM alpha 支持不完整;ProRes MOV 主要面向后期软件。 <video> 能播放不意味着 Mediabunny / WebCodecs 的同一路径也能取出透明帧,必须实测。

背景覆盖的实际选择器见 透明截图实现。

本编辑器接入时需要补齐什么 ​

现有 多轨道编辑和原素材导出 已经提供轨道顺序与外层变换,但有以下明确限制:

环节当前源码事实透明包装轨道需要的改造
工程描述Track 只有 video / audio / text;无 HyperFrames 源工程关联字段扩展 Asset 元数据;是否新增轨道类型由编辑语义决定,预渲染素材可沿用视频轨
导入 / 解码主测试集为 H.264/AAC MP4,没有完整的透明导入验证探测格式、编码与 alpha;验证真实解码像素,失败时提供转码或 PNG 路径
预览代理代理使用 AVC,且配置 alpha: "discard"为透明素材提供保留 alpha 的代理,或在可承受时跳过代理
合成导出每帧先填充工程背景色,再按顺序绘制导出单独包装时清成透明,保留半透明边缘;最终成片仍可填底
输出H.264 编码配置 alpha: "discard",封装 MP4包装素材输出接入独立 alpha 渲染服务或 RGBA 帧管线

导入透明包装并合成为普通 MP4,与从本编辑器导出独立透明包装是两个不同验收目标。 前者只需在最终合成前保留透明;后者要求直到最终编码和封装都保留 alpha。 把现有 H.264 配置改为 alpha: "keep" 并不足以实现后者。

推荐分阶段接入,以下均为待实现方案:

  1. 保存 HyperFrames 工程与参数,通过独立 Producer 渲染出透明包装资产,并先以 PNG 序列验证像素。
  2. 打通一个目标格式的导入、透明解码、预览与原素材合成;当前 AVC 代理不得作为透明素材的替代源。
  3. 支持“修改源工程 → 重新渲染 → 替换轨道素材”;缓存按工程、资源、参数与输出规格共同失效。
  4. 再增加本编辑器的独立透明轨道导出预设,以及更深的草稿转换 / 在线参数编辑。

对应本地证据: Project schema、 代理编码、 导出填底与编码。

透明包装的验收方法 ​

不能仅用“能播放”或文件 metadata 判断成功。建议使用一个包含不透明色块、半透明阴影、 透明空白区和文字边缘的短片,并分别在黑、白、彩色背景上合成:

验收对象通过条件
像素 alpha空白处为 0,实心处为最大值,阴影 / 边缘存在中间值;解码后仍成立
边缘颜色无明显黑边、白边、错误预乘造成的光晕
Seek 与同步首尾、随机时间点、倒序 Seek 与连续渲染画面一致,音频入点一致
预览与导出代理和原素材切换后透明效果不变,最终合成仍能看到底层主视频
环境在实际本地 / 容器 / GPU 环境和目标接收软件中分别验证

WebM 检查可参考上游测试,显式选择能读 VP9 alpha 的 FFmpeg 解码器:

bash
# 在生成 overlay.webm 后执行;FFmpeg 需包含 libvpx-vp9 解码器
ffmpeg -c:v libvpx-vp9 -i renders/overlay.webm -frames:v 1 -pix_fmt rgba -update 1 renders/alpha-check.png

随后检查 PNG 的实际 alpha 像素。只看到 alpha_mode=1 元数据不够;默认解码器也可能在 读取时丢弃 alpha,导致错误地认为原视频不透明。完整接入应覆盖多个时间点与半透明像素, 上游 透明回归测试 提供了透明区和不透明区像素断言的参考。以上为验收设计,尚不是本项目已通过的测试结果。