Communitygithub.com

david-d2c2/动态推广视频

通过代码生成包含动态图形和音频的宣传视频(Canvas + FFmpeg),适用于个人、网站或网店。支持单个产品或批量生成,基于真实数据并带有一个巧妙的自指式噱头。

动态推广视频 是什么?

该技能用于生成完全由代码编写的15-30秒宣传视频:2D Canvas渲染帧,FFmpeg合成视频,numpy合成音频。无需视频模板、After Effects或第三方音乐。支持三种场景:个人品牌(16:9)、少量产品(9:16)以及整个商品目录(9:16,数十或数百个视频)。核心原则是‘不编造任何内容’:视频中展示的每个数字、价格、颜色或特性都必须来自经过验证的来源(网站、商店API、产品页面或项目文档)。如果无法确认,则标记为待定并明确说明。该技能提供三个完整模板,可根据项目需求复制并适配。引擎基于确定性设计(每帧从t = f/FPS计算),确保渲染可复现。它包含一个精心设计的‘噱头’机制——基于产品或人物的真实属性,通过代码实现视觉效果(如隐形、计数器、倾斜文字等)。此外,技能还涵盖了从数据提取、质量控制到交付的完整工作流,确保视频内容准确、合规且具有吸引力。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/david-d2c2/motion-promo-reels/tree/HEAD

在你喜欢的 AI 中提问

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

文档

通过代码生成动态图形的宣传视频

完全由代码生成的15-30秒视频:2D Canvas → 帧 → FFmpeg,音频由numpy合成。无需视频模板、After Effects或第三方音乐。涵盖三种场景:

  • 个人或个人品牌(16:9);
  • 少量产品(9:16);
  • 整个商店的商品目录(9:16,数十或数百个视频)。

指导原则:不编造任何内容。 视频中展示的每个数字、价格、颜色或特性都来自经过验证的来源:网站、商店API、产品页面或项目文档。如果无法确认,则标记为待定并明确说明。

此包在 ${CLAUDE_SKILL_DIR}/templates/ 中提供了三个完整模板(在claude.ai上聊天时:templates/,位于此文件旁边)。将最接近的模板复制到用户的项目中并适配它,而不是重建引擎(参见第4节)。templates/README.md 列出了每个模板需要修改的内容。

所有屏幕文字以品牌受众的语言编写,并用用户的语言回复用户。固定的界面字符串(“from”、“colors”、“NOT HIM”……)通过模板的 textos 块覆盖,切勿直接编辑引擎。在 no_es 中匹配人物的性别。

0. 选择场景

场景模板格式时长噱头单元
个人或个人品牌persona-16x91920×108027秒一个,手写
网站或服务persona-16x9,适配版16:9或9:1620–30秒一个,手写
少量产品(≤10)producto-9x161080×192015.5秒每个产品一个,手写
商品目录(数十至数百个)catalogo-9x161080×192015.5秒每个类别一个,模板短语根据每个产品数据填充

如果用户未指定,则对产品使用9:16,并在一行中说明。

1. 研究(在写任何一行脚本之前)

数据来源,按顺序:

  1. 项目文件夹(如果有)。 阅读 CLAUDE.md、AGENTS.md、决策日志、报告和社交媒体计划。品牌和文案规则(例如“禁止第三方品牌名称”、“非正式语气”、“禁止空洞的夸张”)以及设计令牌、审核规则和法律声明(AI标注)都在其中。这些规则优先于任何创意想法。
  2. 官方网站。 主打内容、服务、数据、方法、技术栈、资质。对于JS繁重的网站,使用浏览器逐部分读取 document.body.innerText。
  3. 在线商店:
    • WooCommerce:/wp-json/wc/store/v1/products?per_page=100&page=N 和 /products/<id>。价格以分为单位。prices.price_range 中min ≠ max → “from”;on_sale + regular_price → 划掉的价格;attributes(颜色、尺寸、尺寸);description(通常带有结构化要点列表);permalink。
    • Shopify:/products.json 和 /products/<handle>.json。
    • 切勿猜测slugs或URL: 从 permalink 中读取。
  4. 网络搜索。 对个人有用,但常见姓名会返回同名者。如果发生这种情况,将其转化为脚本素材(参见第2节),而不是隐藏它。
  5. 照片: 优先使用本地项目文件。云沙箱通常无法从商店下载图片;不要反复重试。要么使用本地照片,要么用代码绘制产品(条纹、缎面波浪和简单形状的效果比你预期的要好)。

记录读取数据的日期:价格会过时。

2. 概念:噱头

噱头是产品或人物的一个真实属性,被转化为视频本身所做的事情。 它不是附加在上面的笑话。以下示例机制,全部在模板中实现(噱头ID在代码中为西班牙语):

机制真实属性视频作用
invisible透明、隐藏、低调一个空帧:“这里有一个盒子。看不见?当然看不见,它是透明的。”然后屏幕像拉链一样拉开。
contador(计数器)大量(米、小时、单位)“这个卷轴持续15秒。这个卷,50米。你来不及用完它。”计数器运行。
diagonal斜裁、条纹或斜线设计文本倾斜45°,条纹穿过屏幕。
brillo(光泽)光泽或缎面处理“这个文本是哑光的。/这个发光的。”(带有光泽)
cortar(切割)无鞋带、无线缆、无系带两根线拉起文本,被切断,文本保持原位。
elevar(提升)平台、推高、高度文本在“垫子”上升起。
secuencia(序列)多种尺寸、宽度或变体真实变体一个接一个切换:“这里是E到H。”
quitar(移除)“无X”绘制两个环并飞走:“消失。”
ritmo(节奏)运动、活动词语卡在节拍上。
reordenar(重新排列)多用途、可转换两行文字交换位置:平行、交叉、V形。
patron(图案)刺绣、印花、蕾丝装饰性图案自行绘制。
calma(平静)敏感类别(健康、术后、孕产…)无噱头、无音效冲击、无打击乐:宁静的音调。
homonimos(同名者,人物)Google上的常见姓名investigar("Name") 显示被划掉同名者并标注“不是他们”,然后“已找到来源”。

规则:

  1. 一个真实、可验证的属性。
  2. 三行:设定、转折、点睛句(点睛句用斜体或强调色)。
  3. 点睛句不能是假的。 如果产品页面没有说明,就不要声称。条件短语(配置中的 si/sino)允许只有在描述支持时才显示点睛句。
  4. 一个固定自指的元素贯穿整个视频,与行业相关:带时间码和帧计数器的HUD(科技)、带针脚计数器的缝线(手工艺、纺织品)、测量“卷轴”的卷尺(时尚、尺码)。在片尾兑现(“这个卷轴测量15.5秒。一个尺码适合所有人。”)。
  5. 切勿拿身体开玩笑。 敏感类别使用 calma。同时确保没有抽象图形可能被解读为身体轮廓。
  6. 无空洞的夸张,无与竞争对手的比较。

3. 结构

9:16 产品(15.5秒,30 fps = 465帧)

场景时间内容
钩子0–3.0噱头
产品3.0–5.6/5.8名称 + 带弹跳效果的照片(或程序化绘制,或占位卡)
范围~2.8秒实际颜色数量或范围(尺码)、变体和颜色及其名称
事实~2.6秒来自产品页面的三个事实,带有动画复选标记
价格~1.8秒实际价格,“from”或促销价,适用时的税费说明
片尾13.2–15.5徽标或品牌、药丸形状的网站、配送或行动号召,以及结尾的俏皮话

16:9 个人或品牌(27秒): 终端 → 同名者被划掉并带有毛刺效果 → 下落(找到来源 + 标题) → 带计数器的数据 → 分阶段的方法 → 工具栈跑马灯(停留在一个自指项目上:“↑ 那是我”) → “此视频:0个模板 · N行代码”(实际数量) → 人物引言 → 带有字母组合、姓名和行动号召的片尾。

4. 引擎

<project>/<reels-folder>/
├── METODO.md        方法、规则和检查清单(供人类使用)
├── CLAUDE.md        状态和待办事项(供下次会话使用)
├── config.json      (目录)商店、属性、标签、调色板和类别 → 噱头 + 短语
├── productos.json   品牌 + 每个产品一个块
├── motor.html       1080×1920或1920×1080画布;window.renderFrame(f) 是**确定性**的
├── render.js        puppeteer-core → 每帧一个JPEG → ffmpeg image2pipe;然后音频和复用
├── audio.py         numpy/scipy合成,使用与motor.html相同的提示表
├── catalogo.js      (目录)API → 产品表:噱头、短语、事实、品牌剥离
├── extraer.js       (目录)使用浏览器UA下载目录和照片并暂停;REVISAR.md
├── fonts/           本地woff2及其许可证(fontsource:`npm pack @fontsource/<family>@<version>`)
├── img/             本地照片
└── out/             最终视频

技术要点:

  • 确定性: 每帧从 t = f/FPS 计算。无requestAnimationFrame,无未种子化的随机数(使用 hash(n))。
  • 辅助函数:clamp、P(t,a,b)(进度)、缓动函数(带弹跳的 eOC、eIOC、eOX、eIX、eOB)、带字间距和alpha的T_()文本函数、使文本缩小到适合的fit()、圆角矩形rr()。
  • 场景是接收本地时间 u = t - T.scene 的函数。转场是每次切换时 ±0.16秒的背景色擦除。
  • render.js:page.evaluateOnNewDocument(spec => window.SPEC = spec),等待 window.READY(字体和图片加载完毕),然后 canvas.toDataURL('image/jpeg', .93) → 输入到 ffmpeg -f image2pipe -c:v mjpeg -i - -c:v libx264 -preset veryfast -crf 18 -pix_fmt yuv420p。
    • 启动Chrome时加上 --allow-file-access-from-files;否则本地图片会污染画布。
    • 在标准路径或CHROME_PATH中查找Chrome或Edge。
    • 保留 --stills t1,t2,… 模式用于审查。
  • 复用:-af loudnorm=I=-14:TP=-1:LRA=11 -c:a aac -movflags +faststart -shortest。
  • 音频:与品牌基调匹配的四和弦进行(科技:128 BPM带底鼓、贝斯和弹拨音;手工艺:112 BPM拨弦和木琴;优雅:96 BPM钢琴和弦乐)。
    • 每个噱头的效果:拉链 = 加速的咔哒声爆发;机器 = 咔哒声列车+嗡嗡声;剪刀 = 两次咬合声;光泽 = 高音琶音。
    • 共享效果:切换时的风声、计数器上的滴答声、价格上的铃声。
    • 底鼓下的轻侧链压缩、tanh限制、然后归一化。
  • 在Windows上,脚本调用 python;在Linux和macOS上,调用 python3。

5. 不编造任何内容的目录数据(catalogo.js + config.json)

  • 显示名称: 产品名称,去除 marcas_a_quitar(要剥离的品牌,如果文案规则要求)和 palabras_tipo(通用类型词,如“Sneaker”或“Boot”)。如果只剩下代码,请使用不带品牌名称的名称。
  • 事实: 描述中 titulo_datos 下的要点,不包括构成。如果没有,则取短描述中按“.”和“:”分割的短语。第三个事实是材质属性中的构成,保留像EVA这样的缩写词。
  • 修剪: 将短语修剪至约54个字符。优先在逗号处修剪;否则在最后一个从句之前(“with”、“for”、“that”、“and”处)。切勿以介词或冠词结尾。
  • 颜色: 名称 → motor.html 中的十六进制表。双色颜色(“Black/White”)会得到分开的色样。未知颜色以中性灰色渲染,并显示其真实名称。
  • 手动编辑: 产品上的 "manual": true 可保护其在下一次提取时不被覆盖。
  • REVISAR.md(审查列表):敏感基调、无要点的页面、无照片或属性的产品。
  • 在实际目录上测试转换,方法是在信任提取器之前,将函数粘贴到商店的浏览器控制台中。如果无法测试下载步骤,请说明。

6. 质量控制(交付前必须执行)

  1. 渲染每个场景的静态帧,使用PIL构建联系表(不要用带多输入的xstack:ffmpeg可能崩溃),然后查看它。检查:
    • 重叠文本或被截断的短语;
    • 大标题上的重音符号与上一行碰撞;
    • 元素侵占另一行;
    • 字母在过度的白色光泽下消失;
    • 属性缺失时出现空的“—”块;
    • 竖屏格式中下半部分为空。
  2. 9:16安全区域:大约250像素(Reels界面)以上或最后约320像素(字幕)以内不要放置重要内容。只有装饰元素可以放在下方。
  3. 数据:当前价格、有范围时使用“from”、可能过期的促销、未确认的单位(标记)、已验证的URL。
  4. 法律与审核:
    • 包含AI生成或AI修改人物的照片 → 视频中需有可见标签(欧盟AI法案,第50条;配置中的 ia.mostrar_si_foto)。发布时也需披露。
    • 产品在身体上展示:完整照片、目录风格、无激进裁剪、较少屏幕时间。
    • 绝不承诺不适用退货或保修。
  5. 音频:ffmpeg -af ebur128 → 约 −14 LUFS。使用 ffprobe 检查时长和分辨率。

7. 交付

  • 在用户机器上工作时,将所有内容写入项目子文件夹,并保持所编辑文件的换行符。不要触碰现有的 CLAUDE.md 文件或文档: 在子文件夹内创建自己的文件。
  • METODO.md:包含哪些内容、如何运行、每条数据的来源、应用的品牌规则、如何添加产品或噱头、发布前检查清单以及已知限制。
  • 子文件夹的 CLAUDE.md:状态、待办事项和不可协商的规则,用几行说明。
  • 展示视频并总结:噱头(每行一个)、所有文件位置、重新生成的命令以及任何仍需确认的数据。

常见错误(避免)

  • 猜测产品slugs。从 permalink 中读取。
  • 旋转文字的噱头覆盖后续行:在文字旋转时重新定位这些行。
  • 过于白色的缎面光泽会吞没字母。使用品牌的浅色调,而不是纯白色。
  • 色样渐变的色标崩溃会留下对角条纹。使用单独裁剪的光泽层来代替。
  • 对有价格范围的产品显示划掉的价格:使用“from”加促销徽章,不带划线。
  • 产品页面上缺少单位(例如尺寸没有“cm”):省略或标记以待确认。
  • 抽象形状组合起来可能暗示身体轮廓:用明确的图形替换它们。

相关技能