演示视频
产品演示、商店预览或功能循环动画,均从用户的真实屏幕录制中构建而成。界面永远不会被重新生成:录制内容会被剪辑、变速、缩放、加框、添加字幕和配音。Apple 对预览也规定了相同的规则(2.3.4:仅允许应用的视频屏幕截图,允许旁白和叠加内容)。一个 cut.json 文件包含了录制内容、有序的场景和变体;democut.py 使用本地 ffmpeg 将其转换为文件,并且重新剪辑是免费的。
第 0 步 — 预检
每个会话执行一次:
python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" tools
kind: "ffmpeg_missing"→ 表示无法进行本地剪辑。请如实告知,并提供references/routing-utility.md中的付费实用工具路径,或要求用户安装 ffmpeg。切勿自行使用其他工具。- 保留
can.burn_captions(libass)、can.duck(sidechaincompress)、can.webm。缺少的能力会影响你承诺的内容,但绝不会影响你所声称的内容。 - 仅当某些内容即将生成(旁白、音乐、音效、配音、底图)时:
command -v genmedia python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" preflightblockers不为空,CLI 缺失或版本低于 0.7.0 →/genmedia-skills:setup。密钥缺失 → 用户自己运行genmedia setup或导出FAL_KEY;等待用户操作。切勿读取、打印、请求或输入密钥。保留config.announce_above_usd和config.confirm_above_usd(默认值分别为 0.50 和 2)。 - 优先恢复:
.genmedia/projects/<slug>/demo-video/cut.json存在 → 从中继续,切勿为同一产品启动第二个剪辑任务。
UX 规则
- 使用用户的母语回复。旁白、
say行和屏幕上的文字保持其原本的语言;模型提示词为英文。路径、ID 和字段名保持不变。 - 聊天中不要包含 JSON、滤镜图、请求 ID 或工具旁白。每个长时间步骤最多显示一行状态信息。
- 问题预算:2 个,一次一个,带标签选项,仅当问题答案缺失时提出:
- Q1 录制内容:当未提供文件时,询问路径并转交
references/recording-tips.md中的简短录制清单。没有默认的素材。 - Q2 视频用途:当请求未说明时:A 网站演示(16:9)· B App Store 预览 · C App Store 头图或搜索结果视频 · D Google Play 推广 · E Product Hunt 发布视频 · F 无声循环或 GIF。可选择多个;一个剪辑任务即可服务于所有用途。 其他所有内容均为您在交付时陈述的默认值:演示视频 60 秒,商店预览 20 秒,App Store 头图或搜索视频 12 秒,循环 6 秒;演示视频默认开启旁白,循环、头图或搜索视频默认关闭旁白;除非要求,否则默认关闭音乐;字幕作为侧边文件提供;使用剪辑而非溶解;除非商店或社交媒体目标要求,否则不加设备边框。
- Q1 录制内容:当未提供文件时,询问路径并转交
- 剪辑卡是一个硬性停止点。 显示场景列表(时间点、内容、旁白、时长)并等待用户确认(是)后再生成或渲染任何内容。沉默不等于同意,对旧版本的同意也不等于对本版本同意。
- 先有旁白,再制作画面。 按场景生成语音,让
time测量其时长,然后据此剪辑画面。切勿通过猜测句子时长来确定场景时间(references/narration-and-audio.md)。 - 交付前检查。 查看最终文件的海报帧和概览图,并查看任何 GIF 的第一帧。一个验证通过但显示了错误屏幕的演示视频仍然是错误的。
- 事实和隐私来自用户。 评分、计数、奖项、客户名称和徽标仅在用户提供时出现。如果某一帧显示了真实数据,解决方案是重新录制,而不是模糊处理;请直截了当地说明。
- 成本:剪辑、帧、循环和每次检查均为 0 美元。在每次生成之前,根据预检结果估算并应用费用门槛:低于
announce_above_usd→ 执行并说明费用;不超过confirm_above_usd→ 一句话说明后执行;高于此值 → 需要明确同意。切勿凭记忆报价。 - 有界限:每个步骤最多进行 3 次修复尝试,每次尝试都应有所改变;内容策略拒绝的任务不得原样重新提交;具有请求 ID 的任务应恢复执行,绝不重新提交。
发现防护栏
scripts/video-surfaces.json 是一个带有日期标记的缓存(verified_on,由 democut.py specs 读取):值为 null 表示该数字未被任何人从官方页面读取过,切勿凭记忆填写;当商店拒绝某个文件时,以官方页面为准,并更正该行。
在会话中首次对某个端点进行付费调用之前:
genmedia models --endpoint_id <endpoint_id> --json
python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" schema <endpoint_id>
status 必须为 active;字段、枚举和限制来自 schema。非活跃状态 → 使用 references/routing-audio.md 中该任务的下一层级。切勿使用提示词而非端点 ID 来执行 genmedia run。新版本位于供应商命名空间下,而不仅仅是 fal-ai/。
路由
| 需求 | 方法 | 原因 |
|---|---|---|
| 修剪、变速、缩放、加框、拼接、叠加、混合、响度、GIF、检查 | democut.py(本地 ffmpeg) | 精确、免费、可重复;产品的像素从不经过模型 |
| 无需观看即可检查录制内容或结果 | democut.py analyze、sheet、grab;frames.py sheet | 使用检测器和概览图,而非猜测 |
| 旁白 | fal-ai/elevenlabs/tts/eleven-v3;土耳其语:fal-ai/gemini-3.1-flash-tts | 默认 TTS;土耳其语路径需经 schema 验证 |
| 背景音乐、UI 音效 | elevenlabs/music/v2.5(精确时长)、fal-ai/elevenlabs/sound-effects/v2 | 时长可控;每秒成本低廉 |
| 字词级精确字幕时间轴 | fal-ai/elevenlabs/speech-to-text/scribe-v2 → audiokit.py captions | 获取字词时间戳 |
| 为已完成文件添加其他语言 | fal-ai/elevenlabs/dubbing | 每种语言调用一次 |
| 设备边框、结束卡、精确的图上文字 | /genmedia-skills:launch-graphics(layers,合成的 PNG) | 文字在精确的地方合成,绝不生成 |
| 带框设备后的背景底图 | bytedance/seedream/v5/pro/text-to-image | 每个视频一张底图,无文字 |
| 无本地 ffmpeg | fal-ai/ffmpeg-api/*(参见 references/routing-utility.md) | 每次调用几分钱,作为备用方案而非默认选项 |
平局决胜和陷阱:
- 界面绝不生成、重设样式、重新构图或“增强”。
video-reframe、video-edit和放大器会重绘 UI 文字:它们适用于生成的素材,不适用于录制内容。 - 以源帧的分数进行缩放,通过
grab --grid或sheet --grid读取;使用hold查看细节,push一次引导视线,pull一次显示上下文(references/editing.md)。 - 商店预览不是带有较短结尾的演示视频:它是独立版本,拥有自己的子场景集。
- Play 和 Product Hunt 需要 YouTube URL,而不是文件:提供文件并说明谁负责上传。
- App Store 头图或搜索结果视频(iOS 27 创意素材)是其自己的无声循环变体:
appstore-header-video(3840x1646)或appstore-search-video(3:2),30 或 60 fps,5-30 秒,一个创意,每个场景至少 2 秒,结尾回到开头。Apple 没有列出通用视频;静态图片属于launch-graphics的工作范围(references/surfaces.md第 1a 节)。 - 手机录制内容需要手机边框;
time会拒绝 30% 的画面长宽比不匹配。 - 仅在
can.burn_captions为真时烧录字幕;否则提供侧边文件,或说明付费字幕路径。 - 用户指定了模型 → 在实时检查后使用它。
工作流程
- 输入阶段。 目标、投放渠道、录制内容、品牌。读取用户指定的每个文件。然后,对每个录制内容执行:
返回信息包含尺寸、fps、时长、音频、任何内置的信箱格式以及画面比例适配的目标。如果录制内容小于目标,或显示了真实数据,则立即要求重新录制,而不是在编辑后要求(python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" init --slug <slug> --name "<产品>" --target web-16x9 python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" source add --slug <slug> --id app --file ./recordings/demo.mov --os desktopreferences/recording-tips.md)。 - 查看录制内容。
查看概览图。python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" analyze --slug <slug> --source app python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" sheet --slug <slug> --source app --count 12 --cols 4 --griddead_spans和keep_spans是候选方案,而非最终编辑:静止的屏幕有时正是需要的效果。对你将要放大的任何帧执行grab --at <s> --grid。 - 剪辑卡。 按顺序列出场景:ID、源入出点、速度、缩放、观众看到的内容、旁白内容、时长;然后是变体、将要生成的内容、需要用户提供的资源以及假设条件。显示它,停止,等待用户确认(
references/editing.md)。 - 旁白,经过测量(仅当演示视频需要配音时)。根据
references/narration-and-audio.md为一个批次定价并运行,每个场景一个文件,然后让测量结果决定画面:python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" price fal-ai/elevenlabs/tts/eleven-v3,elevenlabs/music/v2.5 --explain python3 "${CLAUDE_SKILL_DIR}/scripts/gm.py" batch --plan .genmedia/projects/<slug>/demo-video/voice-plan.json - 编写剪辑。 使用 Write 或 Edit 工具编辑
.genmedia/projects/<slug>/demo-video/cut.json:scenes、audio、variants。每个字段的说明:references/cut-json.md。设备边框来自launch-graphics layers(references/frames-and-loops.md)。 - 门控检查。
在渲染前修复所有错误:python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" time --slug <slug>scene_shorter_than_voice(延长片段、降低速度或删减文字——绝不为适配而加速旁白)、duration_out_of_range(针对商店目标)、wrong_size、fps_not_allowed、transition_too_long、frame_aspect_mismatch、overlay_invisible。处理警告(quick_cut、fast_motion、narration_muted针对创意素材视频)或解释你保留它们的原因。 - 构建。
Bash 超时 600000 毫秒。场景按内容缓存:修订版只重新渲染发生更改的部分(python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" build --slug <slug>--scene <id>、--force)。然后是字幕和循环:python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" captions --slug <slug> --variant <id> --formats srt,vtt python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" gif --slug <slug> --variant loop-16x9 --budget-mb 3 --seconds 6 - 查看结果。 查看海报帧,然后是已完成文件的概览图,最后是 GIF 的第一帧:
检查前 3 秒、缩放过的帧(可读吗?)、最后一帧(稳定了吗?)、检查每一帧是否有私人数据,并逐字母读取提示文件。python3 "${CLAUDE_SKILL_DIR}/scripts/frames.py" sheet genmedia-output/<slug>/demo-video/<variant>/<slug>.mp4 --count 9 --cols 3 - 验证和交付。
检查精确尺寸、fps、时长是否在平台窗口内、编码器和配置文件、字节上限、音频配置、测量响度和真实峰值,以及循环目标上的接缝(python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" validate --slug <slug>loop_seam)。然后发送交付消息。修订:编辑剪辑,重新构建,再次验证。
交付
<产品> 演示:genmedia-output/<slug>/demo-video/
主版本 16:9:web-16x9/<slug>.mp4(1920x1080,<n> 秒)· 海报 web-16x9/<slug>-poster.png
App Store 预览:appstore-iphone/<slug>.mp4(886x1920,<n> 秒,H.264 High,AAC 256k)<仅在构建时显示>
App Store 头图 / 搜索视频:appstore-header-video/<slug>.mov(3840x1646,<n> 秒,<fps> fps,无声循环)· 在 App Store Connect 中选择的海报帧时间:<t> 秒 <仅在构建时显示>
Play 推广 / Product Hunt:使用相同的主版本 — 两个平台都需要 YouTube URL,因此请上传并粘贴链接 <仅在构建时显示>
循环:loop-16x9/<slug>-loop.mp4 · <slug>-loop.gif(<n> MB,<w>px@<fps>)· 第一帧 <slug>-loop-first.png <仅在构建时显示>
字幕:<variant>/<slug>.srt、.vtt(<language>)<仅在构建时显示> · manifest.json
您的录制内容,未经更改:已剪辑,<在等待处加速>,在 <内容> 上缩放,<在绘制的设备中加框>。界面中的任何内容均未重新生成。
为您选择:<时长、场景数量、旁白开/关、音乐、字幕、边框、适配方式 — 用户未设置的每个默认值>
商店说明:<每行一条适用的说明:App Store 预览为 15-30 秒,每设备最多 3 个,仅限屏幕截图(2.3.4)· 头图和搜索视频静默循环(搜索:永不取消静音),在 iOS 27 和 iPadOS 27 或更高版本上显示,其海报帧一经批准即固定不变· Play 推广仅自动播放前 30 秒· Product Hunt 图片(包括 GIF)保持在 3 MB 以下,GIF 在悬停时播放动画>
生成:<无,0 美元 | 在 <模型> 上生成旁白 <n> 行、音乐,预估 美元<x>> · 文件是本地文件;没有上传任何内容。
下一步:指定一个场景以及要更改的内容(入/出点、速度、缩放、文字);重新剪辑是免费的。
进行翻译;保持路径、尺寸和屏幕文本不变。
错误
| 信号 | 操作 |
|---|---|
kind: "ffmpeg_missing" | 本地无 ffmpeg。说明无法在此处进行剪辑;提供 fal ffmpeg-api 路径(references/routing-utility.md)或要求用户安装。 |
source_changed | 录制内容已移动或更改。执行 source add --replace,然后重新检查每个入/出点:旧的时长不再有效。 |
check_failed 来自 time | 每个条目都指定了场景和数字。修复剪辑;只要存在错误,就不渲染任何内容。 |
scene_shorter_than_voice | 延长片段、降低 速度 或删减文字。绝不为适配而加速旁白。 |
duration_out_of_range | 未达到官方窗口(App Store 预览 15-30 秒,头图和搜索视频 5-30 秒)。仅针对该变体丢弃或缩短场景。 |
wrong_size、fps_not_allowed、fps_too_high | 变体的尺寸或 fps 违反了其行规则。删除覆盖值或选择一个该行接受的数值(specs)。 |
来自 validate 的 loop_seam | 循环在重新开始时跳跃。在开头状态结束或保持同一区域,构建,再次验证。 |
frame_aspect_mi |
...
[已截断]