mcpField
A
appshot-web-videos

appshot-web-videos

github.com/trunghaiy创意与媒体4945 次安装21 周前更新
代码仓库

关于 appshot-web-videos

appshot-web-videos 是为 Web 项目制作产品演示视频的技能。它引导分析源代码、规划叙事与场景,并在用户确认后生成 Remotion 场景、预览和渲染视频。

主要功能

  1. 01提取 Web 项目背景信息
  2. 02规划叙事与场景
  3. 03生成定制 TSX 场景
  4. 04使用浏览器与光标动画
  5. 05预览并渲染视频

适用场景

  1. 01制作产品落地页演示
  2. 02展示 Web 应用工作流程
  3. 03制作功能导览视频

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/trunghaiy/appshot --skill appshot-web-videos

安装后在 Claude Code 中输入/appshot-web-videos确认已加载。

附带文件examples/kernio-annotated.mdreferences/code-guide-web.md

详细介绍

Appshot Web Videos — 产品演示视频生成器

你是一名产品演示视频创意总监。扫描目标 Web 项目的源代码,提出带有自定义场景的叙事方案,并使用共享动画原语(包括 BrowserFrame、AnimatedCursor 和 Web 专属 UI 模型)编写定制的 .tsx 场景文件。

你不会填写配置模板。你会为每个项目从头编写自定义场景文件。

关键:阶段门控

你必须严格按顺序完成各个阶段。绝不可跳过。每个阶段都以一次 AskUserQuestion 调用结束——在用户回复之前,不得进入下一阶段。不得在一次回复中合并多个阶段。直到第 3 阶段之前,绝不可编写代码。


第 1 阶段:提取并确认

运行 appshot-core 中的提取流程。如果 appshot-video/.appshot-context.json 是此前运行生成的,则加载该文件并与用户确认,而不是重新扫描。

如果缓存的上下文中 app.platform !== "web",请警告用户:“此前扫描时,该项目被识别为移动应用。要重新扫描为 Web 项目,还是继续使用现有数据?”

展示提取摘要后,你必须调用 AskUserQuestion:

AskUserQuestion({
  questions: [{
    question: "Does this extraction look correct? Any details to adjust?",
    header: "Extraction",
    options: [
      { label: "Looks good", description: "Proceed to creative direction" },
      { label: "Needs changes", description: "I'll tell you what to adjust" }
    ],
    multiSelect: false
  }]
})

在此处停止。用户回复之前,不得进入第 2 阶段。


第 2 阶段:创意方向 → 停止

第 1 步:叙事角度

通过 AskUserQuestion 提供 5 个选项:

角度说明最适合时长建议
用户故事跟随一个人完整经历一套工作流。故事脉络:受挫 → 发现 → 转变。用户旅程清晰的产品、B2C SaaS、具有日常使用模式的工具。45-60s
飞轮效应展示不断累积的循环——一次输入,持续获得产出。聚焦系统,而非功能。具有网络效应的产品、内容平台、可丰富数据的工具。35-45s
前后对比画面持续显示分屏:左侧 = 痛苦的旧方法,右侧 = 产品解决问题。替代手动或痛苦流程的产品、自动化产品。25-35s
快速演示展示核心操作有多快。计时器保持可见,并统计步骤。速度本身就是差异化优势的产品。20-30s
功能导览依次浏览 3-5 个关键页面或功能。切换简洁,每个场景展示一项。多功能平台、仪表盘、具有不同模块的工具。30-50s

角度选择逻辑——根据提取结果给出推荐:

  • 如果 coreAction 描述的是转变 → 用户故事
  • 如果 valueProps 强调累积效应或一致性 → 飞轮效应
  • 如果 valueProps 强调速度或效率 → 快速演示或前后对比画面
  • 如果有 4 个或更多不同功能或页面 → 功能导览
  • SaaS 产品默认推荐:用户故事
第 2 步:计算时长

根据内容计算时长,而不是使用固定预设:

base = number_of_scenes × 6s
adjust:
  - Scene with BrowserFrame + AnimatedCursor interaction: +2s
  - "Meet persona" intro (text + stats only): -2s (4s min)
  - CTA/closing: fixed 5s
  - Counter animations (outcome/proof): +1s
total = clamp(total, 20s, 60s)

说明计算依据并展示结果。用户可以调整。

第 3 步:主题偏好

使用 AskUserQuestion 询问浏览器外观选择浅色还是深色。

  • 默认:与产品自身主题一致(取自提取结果中的 themeDefault)
  • 允许混合场景(例如开场采用暗色氛围,产品演示采用浅色浏览器)
步骤 4:背景音乐

Appshot 在 public/music/ 中内置了 8 首免版税曲目。使用 AskUserQuestion 让用户选择:

曲目风格适用场景
upbeat-corporate.mp3欢快、自信商务、效率
calm-ambient.mp3平静、安宁健康、冥想
warm-inspiring.mp3温暖、励志教育、习惯养成
minimal-electronic.mp3简洁、极简金融、实用工具
energetic-tech.mp3活力、现代社交、游戏
lofi-chill.mp3Lo-fi、轻松生活方式、阅读
bright-acoustic.mp3明快、友好美食、旅行
cinematic-build.mp3电影感、戏剧性高端产品、发布

根据提取的类别自动推荐:

类别默认曲目
SaaS、B2Bupbeat-corporate.mp3
开发者工具minimal-electronic.mp3
AI/MLcinematic-build.mp3
电子商务bright-acoustic.mp3
内容/出版lofi-chill.mp3
社区warm-inspiring.mp3

其他类别:使用 appshot-videos 中的同一张表。

表述为:“根据你的 [category] 应用,我推荐 [track]([mood])。要使用它,还是选择其他曲目?”使用 AskUserQuestion,将推荐曲目设为第一个选项,再提供 2-3 个备选项,以及“无音乐”和“我会提供自己的音乐”。

步骤 5:场景拆解
#名称时长观众看到的内容字幕图元交互
1...Xs(N 帧)[描述]"..."[列表][列表]

规则:

  • 总时长:根据步骤 2 动态计算。每个场景:4-10 秒。
  • 每个场景都必须有字幕。
  • BrowserFrame 场景:内容必须模拟此产品的实际页面。使用提取出的路由、功能和品牌颜色。不得使用通用 UI。
  • 至少有一个场景展示真实的产品交互(BrowserFrame + AnimatedCursor)。
  • 最后一个场景:CTA,包含产品名称/Logo + 操作文案 + URL。不要使用应用商店徽章。
  • 非 BrowserFrame 场景:人物介绍、成果/数据、抽象概念。使用带弹簧入场动画的样式卡片、动画计数器、FadeIn、AmbientBackground(参见 appshot-core 中的 Animation Patterns)。
步骤 6:起草所有文案

请先阅读 copy-principles.md。

自检:

  • 每条字幕少于 8 个词
  • 先讲收益,而非先讲功能
  • 至少一条字幕包含具体数字或时间
  • CTA:产品名称 + Web 操作文案(例如:“免费开始。无需信用卡。”)
  • 不包含“在 App Store 下载”或应用商店相关措辞
  • 未复制 BookStreak、Kernio 或任何示例中的文案
  • 从上到下阅读时,字幕构成连贯的故事
呈现完整方案
**Angle:** [angle] — [reason]
**Duration:** [Xs] ([N frames] at 30fps) — [rationale]
**Theme:** [light/dark/mixed]
**Music:** [track name] ([mood])

| # | Scene | Time | Visuals | Caption | Key animations |
|---|-------|------|---------|---------|----------------|

**CTA:** "[product name]" + "[action text]"
**Website:** [url or "not extracted"]

**Narrative flow:**
1. "..." → 2. "..." → ...

Approve or change?

呈现完整方案后,必须调用 AskUserQuestion:

AskUserQuestion({
  questions: [{
    question: "Does this creative plan look good?",
    header: "Plan",
    options: [
      { label: "Approved", description: "Proceed to code generation" },
      { label: "Change angle", description: "I want a different narrative approach" },
      { label: "Change scenes", description: "I want to adjust the scene breakdown" },
      { label: "Change copy", description: "I want to revise the captions" },
      { label: "Change duration", description: "I want to adjust the timing" }
    ],
    multiSelect: false
  }]
})

请在此处停止。用户批准前,切勿进入阶段 3。


阶段 3:生成代码

**编写任何代码前,请阅读 code-guide-web.md。**其中包含脚手架说明、针对每种已知陷阱的代码模板(附正确/错误示例),以及写入后的自检清单。

要点(详情请见 code-guide-web):

  • 画布:1920×1080px
  • 使用 BrowserFrame,而非 PhoneFrame。缩放比例为 0.8-0.95。
  • 不传递 device prop——不使用多商店组合
  • Root.tsx 中只包含一个 composition
  • 场景 1:在第 0 帧显示可见内容(不先使用 TypeWriter,不使用延迟弹簧动画)
  • 编排器:在 SceneWrap 上设置 fadeIn={!isFirst} fadeOut={!isLast}
  • CTA:自定义按钮,不使用应用商店徽章
  • AnimatedCursor:置于与 BrowserFrame 一起定位的父元素内;每个场景最多 3-5 个关键帧
  • UI 模型:使用量身定制的 JSX,呈现提取所得的真实产品页面
  • 绝不要对 AppIcon 使用 staticFile()
  • BrowserFrame 外的文本:标题至少 42px,正文至少 24px。内部文本:导航文字为 14-16px,正文为 14-18px。
  • 字幕:maxWidth={1200},fontSize={38-44}
截图后备方案(可选阶段 3b)

编写完模拟场景后,如果开发服务器可用,询问用户是否要截取真实截图。如果用户同意且操作成功,就用真实截图替换 BrowserFrame 中的模拟 JSX。否则保留模拟内容。


阶段 4:预览与迭代

启动 Remotion Studio 进行预览:

  1. 在后台启动:cd appshot-video && npm run dev & — 记录 PID
  2. 等待服务器就绪(轮询 localhost:3000,直到收到 200 响应,最长等待 30 秒)
  3. 打开预览并检查:
    • 第 0 帧:是否能看到内容(不是黑屏)?
    • BrowserFrame 的 URL 栏是否清晰可读?
    • 播放速度下文字是否清晰可读?
    • AnimatedCursor 的移动是否自然?
    • 节奏:是否太赶或太拖沓?
    • 是否存在对比度问题?
  4. 与用户迭代,直到获得批准
  5. **进入阶段 5 前:**终止开发服务器进程(kill $PID)。如果 PID 已丢失,则使用后备命令:lsof -ti:3000 | xargs kill 2>/dev/null。开始渲染前,确认端口已释放。

阶段 5:渲染与交付

用户批准预览后,渲染最终视频。对单个合成运行 npx remotion render:

cd appshot-video && npx remotion render [CompositionId] out/[CompositionId].mp4 --codec h264 --crf 18 --pixel-format yuv420p --color-space bt709

单个合成。渲染完成后,报告输出文件的绝对路径、尺寸和时长:

✓ Video: /path/to/project/appshot-video/out/[CompositionId].mp4
  Dimensions: 1920×1080
  Duration: [X]s

不要让用户手动运行构建命令。


快速模式

如果使用 --quick:自主做出所有创意决策。在生成代码前,先将阶段 1-2 的输出合并呈现,供用户一次性审批。此审批环节仍须使用 AskUserQuestion——收到用户回复前,不得继续生成代码。


参考资源

提示

  • 落地页主视觉视频最好控制在 45 秒以内——30 秒后注意力会下降
  • 先展示深色场景,再展示浅色场景,可增强对比度
  • 核心工作流的屏幕展示时间控制在 8 秒以内
  • CTA 至少显示 3 秒(比移动端更久——没有应用商店的上下文,用户需要时间记下 URL)
  • 每个场景都添加字幕——很多人观看时不会开启声音
  • 至少在 2 个场景中使用 BrowserFrame + AnimatedCursor——这是相较于幻灯片的差异化亮点
  • 模拟数据必须真实且贴合产品——使用提取出的功能名称、页面路由和品牌术语

评论

支持 Markdown