cs-web-promo-film · git:20261006.c2a8989 · 2026-10-06 · sha256 80b1937ff864214a

cs-web-promo-film git:20261006.c2a8989A

Immutable. This exact content never changes and is served at /api/v1/blob/80b1937ff864214a.

---
name: cs-web-promo-film
description: "把真实网页做成 30–60 秒产品演示宣传片:Playwright 采集页面长截图,Remotion 用虚拟浏览器窗口做推进、平移、滚动和点击,渲染可交付 mp4,并可附口播稿。触发词包括 $cs-web-promo-film、网页宣传片、产品演示片、把这个网页做成视频、产品功能演示。不用于网页幻灯片、静态海报、真人出镜、电商对标复刻(改用 $cs-auto-videl)、ChatCut 策划或时间线剪辑(改用 $cs-chatcut)。"
---

<!-- CS Skills · 陈硕 | portable skill entry | https://github.com/ChenShuo2004/cs-skills -->

# CS 网页宣传片

把真实页面做成有「产品演示」质感的短片。核心主张:**不重绘产品界面,只决定镜头怎么看它**。片中每一个像素都是页面上真实存在的东西,可信度全部来自这一点。

## 交付边界

- 默认交付一个 Remotion 工程 + 一支 mp4:1920×1080、60fps、30–60 秒、H.264。
- 默认**无音轨**(留给后期配 BGM)。用户要 BGM 或口播时才加,且口播稿单独出 `VO.md`。
- 页面内容一律来自 Playwright 采集的长截图,禁止用 HTML/CSS 重画产品界面、禁止手打页面上的文案当作截图内容。
- 只拍匿名访客能真实打开的公开页面。付费浮层、cookie 条、站方广告可以在采集时隐藏,产品功能区不得改动。
- 调色(整体曝光)允许,改内容不允许。
- 不部署、不上传、不发布。仅在用户明确要求后导出其他规格或分发。
- 网页幻灯片不是本 skill。电商对标复刻交给 `$cs-auto-videl`。ChatCut 策划与剪辑交给 `$cs-chatcut`。

## 先读什么

按当前阶段读最少的资料:

- 采集页面、量元素坐标:[references/capture.md](references/capture.md)
- 设计运镜、写分镜、搭工程:[references/camera.md](references/camera.md)
- 需要提升动效质感时,把参考、节拍和视觉事件写成导演 brief:[references/motion-direction.md](references/motion-direction.md)
- 渲染、抽帧验收、修接黑、去音轨:[references/render-qa.md](references/render-qa.md)
- 写口播稿:[references/voiceover.md](references/voiceover.md)
- 交付前自检:[references/quality-checklist.md](references/quality-checklist.md)

把 [scripts/](scripts/) 拷到工程根;把 [assets/promo-starter/src/](assets/promo-starter/src/) 拷到工程 `src/`;采集配置从 [assets/capture.config.example.json](assets/capture.config.example.json) 复制为工程根的 `capture.config.json`。不要从零手写窗口和动画工具。`PromoFilm.tsx` 是每个片子唯一需要真正手写的文件。

## 工作方式

### 1. 先问清三件事,其余自己定

只有这三件会改变片子的骨架,缺了必须问:

1. **时长与用途**(15/30/40/60 秒;投放在哪、给谁看)
2. **叙事顺序**(先讲什么后讲什么;哪个是主入口)
3. **色调气质**(暖深色 / 冷深色 / 明亮 / 跟随品牌页)

页面上能查到的(有几个板块、工具叫什么、链接指向哪)自己去页面上看,不要问用户。

### 2. 打开页面,摸清真实结构

动工前必须先采一轮截图并**实际看图**。常见的意外,早发现比返工便宜:

- 用户给的链接不是他以为的那一页(分享链接常指向子页)。
- 关键板块未登录不渲染(书架、收藏、个人数据),片子不能靠它承担叙事。
- 页面在内层容器里滚动,`fullPage: true` 只截到一屏。
- 浅色页面和深色页面混排,直接切会闪。

结构和用户的预期不一致时,带着截图说明现状,给出可行的替代取材,再继续。

### 3. 采集:一次采全,采准

运行 `node scripts/capture.mjs`,把目标写在工程根的 `capture.config.json`。要点见 capture.md,最关键的两条:

- 先滚到底触发懒加载,再把 viewport 撑到 `scrollHeight` 高度截图,不要指望 `fullPage`。
- `deviceScaleFactor: 2`,逻辑宽度固定 1440,之后所有坐标都用这套逻辑单位。

采完把每张图的真实像素高度填进 `tokens.ts` 的 `PAGES`,运镜全靠它换算。

### 4. 量坐标,不要目测

运行 `node scripts/measure.mjs` 产出 `boxes.json`,拿到每个关键元素的页面坐标。**所有推进落点、平移目标、点击位置都从实测坐标算**。目测的运镜一定会把四列网格裁成三列半,或者把指针点在链接旁边的空白上。

### 5. 写分镜,再搭片子

分镜先落成一张表:时间、画面、镜头动作、屏幕文案。一段只做一件事,一次只推进一个信息。若用户要求高级动效或提供参考片,先按 motion-direction.md 明确观看主次、关键事件、层间错相和可检验的禁止项,再实现镜头。

节奏基准(40 秒片):开场题字 3–4 秒,每个内容段 6–8 秒,转场 0.85 秒,收尾 3 秒。段落少于 6 秒观众来不及读完屏幕文案。

然后按 camera.md 搭 `PromoFilm.tsx`:每段一个 Layer,所有几何量用同一组 `stops` 打关键帧,转场用共享的 `CUT` 区间。

### 6. 渲染并逐段看图验收

渲染后**必须抽帧并真的读图**,不能只看渲染成功就交付。按 render-qa.md 做三项:

1. 每段中点抽静帧,逐张检查取景是否裁切、文案是否叠压、指针是否落在链接上。
2. `node scripts/luma-sweep.mjs` 扫全片亮度,确认转场处没有掉黑。
3. `ffprobe` 确认时长、帧率、无音轨。

发现问题改参数重渲,不要在文档里记「已知瑕疵」蒙过去。

### 7. 需要口播时单独出稿

按 voiceover.md 写。铁律:**口播不复述屏幕上已有的字**,画面负责「是什么」,口播负责「为什么值得」。加了口播就要回头删掉画面里重复的正文行。

默认无音轨时,信息由底部字幕承担,规则相同:不复述页面上已有的字,每句 11–16 字。

### 8. 多画幅是两套取景,不是裁切

默认只做 1920×1080。用户明确要竖屏或 3:4 时:

- 同一条叙事、同一套 `CUT` / 字幕 / 数字口径。
- 另写一份 Film 文件重排窗口,**不要把 16:9 裁成 9:16**。桌面三栏页直接裁会切卡片。
- 竖屏常见改法:网格改两列纵滚、落地页用短窗口避开会过期的模块、字幕上移躲开平台控件。
- 规格:9:16 用 1080×1920;3:4 用 1080×1440。帧率仍 60。

### 9. 片中数字必须能从页面重新拉出来

专题数、工具数、节点数一律读自公开页,写进常量,采集当天记下日期。产品增减时先复核再重渲,不要用手写记忆。会随日期变化的模块(「今天一眼看懂」、黄历、个性化推荐)不要入镜。

## 硬约束

这些是踩过的坑,不要重犯:

- **转场接黑**:两层各自用 ease-out 曲线交叉淡化,不透明度之和小于 1,转场处会闪一下黑。必须用近线性曲线,且出场层的淡出区间与入场层的淡入区间**完全相同**。改完用 luma-sweep 验证,不要靠眼睛。
- **浅色页混排**:浅色页放到深色画布上要整体压曝光到 0.93–0.95,否则切过去像闪光灯。这是调色,不改内容。
- **窗口消失在背景里**:近黑的产品页放在近黑画布上会糊成一团,窗口后面需要一层暖光 halo 和足够强的投影把它托起来。
- **Remotion 自带 ffmpeg 阉割**:`fps`、`crop` 等滤镜被禁用。抽帧用 `-r` 控制输出帧率,裁切一律用 CSS `overflow` 做,不要写滤镜。
- **静音音轨**:Remotion 即使没有音频源也会写一条静音轨。交付前用 `remotion ffmpeg -i in.mp4 -c:v copy -an out.mp4` 剥掉,不要重编码视频。
- **字体**:中文用 `@remotion/google-fonts` 载入并 `waitUntilDone()`,不要依赖系统字体,渲染机上不一定有。
- **Windows 浏览器路径**:Playwright 会去找沙箱缓存。采集前先 `$env:PLAYWRIGHT_BROWSERS_PATH="$env:LOCALAPPDATA\ms-playwright"`,否则报 `Executable doesn't exist`。
- **浅色片不要压曝光**:全程浅色页时 `grade` 保持 1,用略深于页面的画布加投影分层。只有深浅混排才压到 0.93–0.95。
- **大图不要同时挂载**:同一段里多张 2× 长截图 `alpha` 接近 0 时直接 `return null`。六张 2880px 图一起解码会报 `EncodingError`。
- **渲染并发**:出现解码错误时加 `--concurrency=2`,不要默默降画质。

## 最终回复

说明:成片路径与规格(分辨率/帧率/时长/有无音轨/体积)、叙事顺序、素材来源页面、做过的调色与隐藏处理、验收结论,以及改时长、改文案、改运镜分别改哪个文件。