Files
workbuddy_skills/oil-motion/references/chroma-video.md
T
admin 237a09a5b0 修:draw-ui / oil-motion 原被当子模块指针收录 ⇒ 改为正常文件入库(两份内容原先对别人是空的)
一、问题(本轮实测)
`draw-ui` 与 `oil-motion` 目录里**各自带一个内嵌 `.git`** ⇒ 上一次提交把它们记成了 **gitlink(子模块指针)**
⇒ 仓库里只存了一个不属于任何远端的 commit id,**别人克隆下来这两份是空的** ✗(`git status` 显示 ` m draw-ui` / ` m oil-motion` = 子模块内容有改动)。

二、处置(可回退)
· 把两处的 `.git` **挪走**(⛔ 不是删除)⇒ `归档/内嵌git-20261008/{draw-ui,oil-motion}.git`;
· `git rm --cached` 掉那两个 gitlink,再 `git add` 两个目录 ⇒ **按正常文件入库**(内容才真的进仓库)。

三、副作用(如实记)
挪走 `.git` 后,这两个技能**不能再原地 `git pull` 取上游更新**(要更新得重新拉一份覆盖);
如需恢复其本地仓库,把 `归档/内嵌git-20261008/` 里的 `.git` 挪回原处即可。
2026-10-08 22:29:52 +08:00

95 lines
4.2 KiB
Markdown

# 色键视频路线
仅当 `background_owner: page` 且预算返回 `delivery.selected=chroma-video` 时读取。主体通过 WebGL 实时生成 Alpha,页面拥有最终背景。
如果镜头、环境光、接触阴影、景深或背景连续性属于画面主体的一部分,停止本路线并回到合同改用 [baked-video.md](baked-video.md)。
## 编译
输入必须是从已验收透明关键帧确定性合成、并由视频模型保持均匀的色键母版:
```bash
python3 "$OIL_MOTION/scripts/compile_scroll_video.py" \
"$SOURCE_VIDEO" "$OUTPUT_DIRECTORY" \
--background-owner page \
--budget-report build/motion-budget.json \
--frame-policy "$FRAME_POLICY" \
--fps "$TARGET_FPS" \
--timeline-output build/timeline.json \
--desktop-width "$DESKTOP_WIDTH" \
--mobile-width "$MOBILE_WIDTH"
```
需要记录语义锚点时追加 `--anchor NAME=SOURCE_FRAME`;静态降级状态使用 `--poster-source-frame`。索引都基于帧准备后的序列,编译器会在清理后重新映射。
编译器会:
1. 按 `frame_policy` 保留原始帧或插帧,并输出接触表与报告。
2. 按需清理接缝或重复尾帧。
3. 检查整段代表帧的色键颜色与边缘均匀度。
4. 编码桌面与移动全关键帧 MP4。
5. 逐帧模拟运行时抠色,使用与 WebGL 相同的 `dominance-v2` 参数检查残留、误删和溢色。
6. 生成编码后 Alpha 接触表、`background-matrix`、静态 Alpha 降级图和 `compile.json`。
多段时间轴用 `--initial-state-id` 指定初始状态,并用重复的 `--segment DESTINATION_STATE_ID=START:HOLD:END_EXCLUSIVE` 传入后续状态与帧边界。编译器从最终保留帧生成状态映射与 `timeline.json`,页面不得手工换算秒数。
默认删除可重新生成的中间 PNG;诊断帧准备、抠色或编码问题时才使用 `--keep-frames`。
## 抠色硬门
- 编译后的实际 MP4 解码帧仍有可见色键块、边缘溢色、主体内部误删或半透明脏边时,拒收母版。
- 禁止靠扩大抠色阈值、腐蚀轮廓或模糊边缘掩盖素材缺陷。
- 阈值只能复现已验收母版的已知色键,不能修复不均匀背景或错误主体颜色。
- 半透明、发丝和大范围运动模糊属于高风险输入;无法稳定通过时重新生成,或重新评估背景归属。
- 自动报告通过后仍要查看白、黑、高饱和色和真实页面背景上的合成结果。
## 网页接入
使用两个共享实现:
- [assets/interactive-motion.ts](../assets/interactive-motion.ts):按 `runtime.controller` 控制帧或视频时间。
- [assets/chroma-video-renderer.ts](../assets/chroma-video-renderer.ts):读取 `compile.json.runtime.keying` 并绘制透明 Canvas。
`frame-scrub` 调用 renderer 的 `render(frame)`。`segment-playback` 或 `autonomous-playback` 在视频按时间播放期间调用 `startLive()`,停止或销毁时调用 `stopLive()`。不要在页面复制 Shader 参数或另写抠色算法。
```ts
const runtime = manifest.runtime;
const renderer = createChromaVideoRenderer({
video,
canvas,
frameCount: runtime.frameCount,
fps: runtime.fps,
keying: runtime.keying,
});
```
页面不能直接显示色键视频:
```html
<section class="motion-stage">
<video class="motion-source" muted playsinline preload="auto"></video>
<canvas class="motion-canvas"></canvas>
</section>
```
```css
.motion-stage { background: var(--page-background); }
.motion-source { display: none; }
.motion-canvas { width: 100%; height: 100%; display: block; }
```
## 加载与降级
- 预加载静态 Alpha 状态、视频元数据和首个需要的媒体。
- WebGL、视频解码或资源加载失败时显示静态 Alpha 图,不能露出色键母版。
- `prefers-reduced-motion` 显示合同指定的静态 Alpha 状态。
## 验收
- `qa/post-encode-keying.json` 的桌面与移动结果均为 `passed: true`。
- `compile.postEncodeKeyingPassed` 为 `true`,实际检查帧数与报告一致。
- 查看 Alpha 接触表和 `background-matrix`;自动报告不能替代视觉检查。
- `allFramesAreKeyframes` 为 `true`。
- 按实际 `runtime.controller` 检查快速反向、停帧、连续播放或循环。
- 页面更换背景只改变页面层,不重新生成主体。