Communitygithub.com

funi-ai/demo-video

产品演示、商店预览、App Store 头图/搜索结果视频及循环动画,均从用户真实的屏幕录制中剪辑而成:修剪、变速、缩放、加框、字幕和配音,全部使用本地 ffmpeg 处理。

demo-video 是什么?

该技能可以从用户的真实屏幕录制中创建产品演示视频、商店预览、App Store 头图/搜索结果视频以及循环动画。它利用本地 ffmpeg 进行视频的非破坏性编辑,包括修剪、变速、缩放、加框和添加字幕。对于配音,它使用 ElevenLabs v3 和 Google Gemini TTS(支持土耳其语),并自动添加音乐和 UI 声音,确保模型只生成产品之外的内容。该工作流程(通过 `cut.json` 和 `democut.py` 管理)支持多次免费重新剪辑,并严格遵循平台指南(例如 Apple 2.3.4),将基于模型的生成限制在配音和音效上,从不重新生成或修改用户的实际用户界面录制。该技能提供详细的交付选项,包括 MP4、WebM、GIF、SRT/VTT 字幕和海报帧,并提供严格的验证和成本控制,确保在渲染前所有输出都符合平台规范。

兼容平台✓Claude Code~Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/funi-ai/claude-plugins/tree/main/plugins/genmedia-skills/skills/demo-video

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

演示视频

产品演示、商店预览或功能循环动画,均从用户的真实屏幕录制中构建而成。界面永远不会被重新生成:录制内容会被剪辑、变速、缩放、加框、添加字幕和配音。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" preflight
    
    blockers 不为空,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 规则

  1. 使用用户的母语回复。旁白、say 行和屏幕上的文字保持其原本的语言;模型提示词为英文。路径、ID 和字段名保持不变。
  2. 聊天中不要包含 JSON、滤镜图、请求 ID 或工具旁白。每个长时间步骤最多显示一行状态信息。
  3. 问题预算: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 秒;演示视频默认开启旁白,循环、头图或搜索视频默认关闭旁白;除非要求,否则默认关闭音乐;字幕作为侧边文件提供;使用剪辑而非溶解;除非商店或社交媒体目标要求,否则不加设备边框。
  4. 剪辑卡是一个硬性停止点。 显示场景列表(时间点、内容、旁白、时长)并等待用户确认(是)后再生成或渲染任何内容。沉默不等于同意,对旧版本的同意也不等于对本版本同意。
  5. 先有旁白,再制作画面。 按场景生成语音,让 time 测量其时长,然后据此剪辑画面。切勿通过猜测句子时长来确定场景时间(references/narration-and-audio.md)。
  6. 交付前检查。 查看最终文件的海报帧和概览图,并查看任何 GIF 的第一帧。一个验证通过但显示了错误屏幕的演示视频仍然是错误的。
  7. 事实和隐私来自用户。 评分、计数、奖项、客户名称和徽标仅在用户提供时出现。如果某一帧显示了真实数据,解决方案是重新录制,而不是模糊处理;请直截了当地说明。
  8. 成本:剪辑、帧、循环和每次检查均为 0 美元。在每次生成之前,根据预检结果估算并应用费用门槛:低于 announce_above_usd → 执行并说明费用;不超过 confirm_above_usd → 一句话说明后执行;高于此值 → 需要明确同意。切勿凭记忆报价。
  9. 有界限:每个步骤最多进行 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每个视频一张底图,无文字
无本地 ffmpegfal-ai/ffmpeg-api/*(参见 references/routing-utility.md)每次调用几分钱,作为备用方案而非默认选项

平局决胜和陷阱:

  1. 界面绝不生成、重设样式、重新构图或“增强”。 video-reframe、video-edit 和放大器会重绘 UI 文字:它们适用于生成的素材,不适用于录制内容。
  2. 以源帧的分数进行缩放,通过 grab --grid 或 sheet --grid 读取;使用 hold 查看细节,push 一次引导视线,pull 一次显示上下文(references/editing.md)。
  3. 商店预览不是带有较短结尾的演示视频:它是独立版本,拥有自己的子场景集。
  4. Play 和 Product Hunt 需要 YouTube URL,而不是文件:提供文件并说明谁负责上传。
  5. 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 节)。
  6. 手机录制内容需要手机边框;time 会拒绝 30% 的画面长宽比不匹配。
  7. 仅在 can.burn_captions 为真时烧录字幕;否则提供侧边文件,或说明付费字幕路径。
  8. 用户指定了模型 → 在实时检查后使用它。

工作流程

  1. 输入阶段。 目标、投放渠道、录制内容、品牌。读取用户指定的每个文件。然后,对每个录制内容执行:
    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 desktop
    
    返回信息包含尺寸、fps、时长、音频、任何内置的信箱格式以及画面比例适配的目标。如果录制内容小于目标,或显示了真实数据,则立即要求重新录制,而不是在编辑后要求(references/recording-tips.md)。
  2. 查看录制内容。
    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 --grid
    
    查看概览图。dead_spans 和 keep_spans 是候选方案,而非最终编辑:静止的屏幕有时正是需要的效果。对你将要放大的任何帧执行 grab --at <s> --grid。
  3. 剪辑卡。 按顺序列出场景:ID、源入出点、速度、缩放、观众看到的内容、旁白内容、时长;然后是变体、将要生成的内容、需要用户提供的资源以及假设条件。显示它,停止,等待用户确认(references/editing.md)。
  4. 旁白,经过测量(仅当演示视频需要配音时)。根据 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
    
  5. 编写剪辑。 使用 Write 或 Edit 工具编辑 .genmedia/projects/<slug>/demo-video/cut.json:scenes、audio、variants。每个字段的说明:references/cut-json.md。设备边框来自 launch-graphics layers(references/frames-and-loops.md)。
  6. 门控检查。
    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 针对创意素材视频)或解释你保留它们的原因。
  7. 构建。
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" build --slug <slug>
    
    Bash 超时 600000 毫秒。场景按内容缓存:修订版只重新渲染发生更改的部分(--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
    
  8. 查看结果。 查看海报帧,然后是已完成文件的概览图,最后是 GIF 的第一帧:
    python3 "${CLAUDE_SKILL_DIR}/scripts/frames.py" sheet genmedia-output/<slug>/demo-video/<variant>/<slug>.mp4 --count 9 --cols 3
    
    检查前 3 秒、缩放过的帧(可读吗?)、最后一帧(稳定了吗?)、检查每一帧是否有私人数据,并逐字母读取提示文件。
  9. 验证和交付。
    python3 "${CLAUDE_SKILL_DIR}/scripts/democut.py" validate --slug <slug>
    
    检查精确尺寸、fps、时长是否在平台窗口内、编码器和配置文件、字节上限、音频配置、测量响度和真实峰值,以及循环目标上的接缝(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

...

[已截断]

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

funi-ai/ads

Ads from the user's REAL product: UGC and polished ad videos (presenter, unboxing, showcase, testimonial, TV spot) and static ads with copy. Physical products: keyframes locked to the product photo, Seedance clips or TTS + OmniHuman, GPT Image 2.5 copy. Apps and SaaS: real captures and recordings, composited, never regenerated. Use when: "make a UGC ad for this product", "15 second TikTok ad", "static ad with this headline", "app install ad from my screen recording", "A/B ad variants", "bu ürün için reklam videosu yap", "uygulamam için reklam hazırla", "indirim görseli hazırla". Chain: consumes `product-photoshoot` stills, `character` @handles, `launch-graphics` pages; produces ads and a manifest. NOT for: text-free product photos (use `product-photoshoot`); posters (use `image`); listing cards (use `marketplace-cards`); store screenshots, OG cards (use `launch-graphics`); one clip (use `video`); organic shorts (use `short-video`); product demos (use `demo-video`); thumbnails (use `youtube-thumbnail`).

funi-ai/youtube-thumbnail

Thumbnails and covers that survive at small size: YouTube thumbnails (16:9), Shorts, Reels and TikTok covers (9:16), podcast and course covers (1:1), from a title plus an optional face photo, @handle character, brand colours or a frame of the user's own video. Text baked in by GPT Image 2.5; faces locked through reference edits. Use when: "make a thumbnail for my video", "YouTube thumbnail with my face", "Shorts cover", "podcast cover art", "thumbnail from this frame", "change only the text on the thumbnail", "videoma thumbnail yap", "kapak görseli hazırla", "küçük resimdeki yazıyı değiştir". Chain: consumes an @handle from `character` and stills or frames from `image` and `video`; produces sized PNG and JPEG. NOT for: posters, photo edits (use `image`); logos (use `brandkit`); link cards, OG images (use `launch-graphics`); ad creatives (use `ads`); the video (use `video`, `short-video`); new characters (use `character`); batches (use `pipelines`); model choice (use `models`); setup problems (use `setup`).

相关技能