用Remotion + Claude Code从零做一个AI视频

用Remotion + Claude Code从零做一个AI视频

2026/03/2415 分钟
分类:技术分享
标签:#AI#视频#工具#教程#人工智能#前端#编程

黑粉科技 — 让普通人也能驾驭 AI。掌握 AI 的人,将成为各个领域的王者。
官网:https://hyphentech.top
⚙️
这是一篇精确到代码行的实战指南。不是概念科普,不是工具列表——而是一套完整的「提示词 → React代码 → MP4视频」管线。读完并跟着操作,你就能用自然语言描述生成专业级的动态视频。

为什么是Remotion,而不是其他AI视频工具?

Veo、Sora等AI视频工具擅长「无中生有」——你描述一个场景,它生成一段实拍风格的视频。但它们有三个根本问题:输出不可控、不可复现、不可参数化。

Remotion走的是另一条路:视频 = React组件 + 时间轴。你写的每一行JSX、每一个CSS属性,都会被逐帧渲染成真实的MP4视频。同样的代码、同样的参数,永远产出完全一样的结果。

而2026年初 Remotion发布的Agent Skills,让这整个流程发生了质变:你不再需要手写代码,而是用自然语言提示词告诉Claude Code你想要什么,它来生成正确的Remotion代码,你在Studio中实时预览,满意后一键渲染成MP4。

这就是本文要讲的完整管线:提示词 → 预览 → 调整 → 渲染


第一部分:环境搭建

1.1 前置条件

确保你的机器上有以下工具:

Node.js 16+(推荐 Node 20 LTS)、npm 或 bun、一个代码编辑器(VS Code推荐)、Claude Code(命令行工具)

1.2 初始化Remotion项目

# 方法一:用npm
bun create video
# 或
npm init video

cd my-video
npm start
# 浏览器打开 localhost:3000 即可RemotionStudio预览

创建完成后,项目结构如下:

my-video/
├── src/
│   ├── Root.tsx          # 注册所有Composition
│   ├── Composition.tsx   # 主视频组件
│   └── index.ts          # 入口文件
├── public/               # 静态资源(图片、音频、字体)
├── package.json
└── remotion.config.ts

1.3 安装Agent Skills(核心步骤)

这是让Claude Code「理解」Remotion的关键一步:

npx skills add remotion-dev/skills

运行后,你会看到项目中出现:

.claude/skills/remotion-best-practices/
├── SKILL.md              # 主入口文件
└── rules/
    ├── animations.md     # 动画最佳实践
    ├── audio.md          # 音频处理规则
    ├── compositions.md   # Composition结构规范
    ├── fonts.md          # 字体加载
    ├── subtitles.md      # 字幕处理
    └── 3d.md             # Three.js集成

Agent Skills本质是一组Markdown规则文件。Claude Code启动时会自动扫描并加载这些规则,从此它就能用正确的Remotion API模式生成代码,而不是用通用的Web动画方式来凑合。

⚠️
没有Agent Skills的Claude Code会怎样? 它会试图用CSS transitions和setTimeout做动画——这些在浏览器里能跑,但在Remotion的逐帧渲染中会完全崩溃。安装Skills后,Claude会改用interpolate()spring()和基于帧的时间控制,这才是Remotion的正确姿势。

第二部分:Remotion核心概念速览

在写提示词之前,你需要理解Remotion的四个核心抽象。即使你让Claude写代码,理解这些概念会让你的提示词质量暴增。

2.1 Composition——视频的「画布」

每个视频是一个<Composition>,定义了宽高、帧率、总时长和渲染的React组件:

<Composition
  id="MyVideo"
  component={MyVideoComponent}
  width={1920}
  height={1080}
  fps={30}
  durationInFrames={300}  // 300帧 ÷ 30fps = 10秒
/>

关键点:Remotion中的时间单位是「帧」而不是「秒」。扂30fps时,1秒=30帧,3秒=90帧。

2.2 useCurrentFrame()——时间的唯一真相

这是Remotion最重要的Hook。它返回当前帧号(从0开始),所有动画都必须基于这个值来驱动:

import { useCurrentFrame } from 'remotion';

const frame = useCurrentFrame();  // 第0帧返回0,第30帧返回30...
const opacity = Math.min(1, frame / 30);  // 前1秒淡入
🚨
切记:所有动画必须由useCurrentFrame()驱动。Remotion渲染时会随机跳到任意帧号拍截图,如果你用CSS transition或setTimeout,每一帧的状态都是不确定的,会导致画面闪烁和跳帧。

2.3 interpolate()——万能映射函数

将一个数值范围映射到另一个数值范围。这是Remotion动画的基石:

import { interpolate, useCurrentFrame } from 'remotion';

const frame = useCurrentFrame();

// 前20帧:透明度0→1,之后保持为1
const opacity = interpolate(
  frame,
  [0, 20],           // 输入范围(帧号)
  [0, 1],            // 输出范围(透明度)
  { extrapolateRight: 'clamp' }  // 超出范围后锁定为1
);

// 多段插值:淡入 → 保持 → 淡出
const opacity2 = interpolate(
  frame,
  [0, 20, 80, 100],  // 四个关键帧
  [0, 1,  1,  0]     // 对应透明度
);

2.4 spring()——物理动画引擎

interpolate的线性插值更自然。默认从0到1,带有微小的回弹超调:

import { spring, useCurrentFrame, useVideoConfig } from 'remotion';

const frame = useCurrentFrame();
const { fps } = useVideoConfig();

const scale = spring({
  frame,
  fps,
  config: {
    mass: 1,        // 质量,越小越快
    damping: 10,    // 阻尼,越大越不弹
    stiffness: 100, // 刚度,越大越「脏」
  },
});

// 用spring值驱动位移
const x = interpolate(scale, [0, 1], [0, 200]);

2.5 Sequence——场景编排

<Sequence>用于时间偏移,让子组件在指定时刻开始:

import { Sequence } from 'remotion';

// 场景1:第0-90帧(3秒)
<Sequence from={0} durationInFrames={90}>
  <Scene1 />
</Sequence>

// 场景2:第90-180帧(接上3秒)
<Sequence from={90} durationInFrames={90}>
  <Scene2 />
</Sequence>

关键:Sequence内部的useCurrentFrame()是相对的——Scene2中的frame 0实际是全局的frame 90。


第三部分:提示词框架——如何跟Claude Code对话

现在进入核心环节。安装好Agent Skills后,你在项目目录下启动Claude Code,然后用提示词生成视频。

3.1 基础提示词结构

一个有效的Remotion提示词应包含以下要素:

创建一个[X秒]的视频。

场景描述:[...详细描述每个场景的内容]
动画风格:[干净/进攻/柔和/赛博朋克...]
色调:[主色+辅色+背景色]
分辨率:[1920x1080 / 1080x1920竖屏]
帧率:[30fps]

3.2 第一层:快速原型提示词

适合快速验证效果,5分钟出片:

💬
创建一个5秒的视频。深蓝色背景(#0F1923),白色文字“欢迎来到黑粉科技”从中间淡入,保持两秒,然后向左滑出。使用spring动画使过渡流畅自然。

3.3 第二层:多场景结构化提示词

适合有明确分镜的视频:

💬
创建一个15秒的产品介绍视频,1920x1080,30fps。

场景1(0-3秒):Logo从粒子中凝聚成型,带spring回弹效果。背景深色,logo发光。

场景2(3-9秒):依次展示三个功能特点,每个占时约2秒。图标从左侧滑入,文字从右侧淡入。使用stagger动画(每个延迟10帧)。

场景3(9-15秒):CTA“立即体验”按钮动画出现,带周期性脉冲光晕效果。底部显示hyphentech.top

配色方案:背景#0F1923,主色#13C2C2(cyan),强调#FFB300(amber)。

字体:Noto Sans SC。

3.4 第三层:带技术约束的专业提示词

当你对Remotion API有了理解后,可以直接在提示词中指定技术细节:

💬
创建一个10秒的YouTube频道片头,30fps,1920x1080。

技术要求:

  • 使用AbsoluteFill作为每个场景的容器
  • 用Sequence组件编排三个场景
  • 所有动画用spring()而不是线性插值,damping:12,stiffness:100
  • 将配色方案抽成CSS变量(--bg, --cyan, --amber)
  • Logo图片从public/logo.png加载,用staticFile()引用
  • 导出为独立组件,便于复用

场景设计:

场景1:暗场中,网格背景淡入,logo带scale spring动画出现。

场景2:终端风格的打字机动画,逐字显示频道名称。

场景3:所有元素汇聚,显示最终logo+口号+网址。


第四部分:完整工作流实战

4.1 提示词 → 预览 → 迭代循环

实际工作流如下:

步骤1:在项目根目录启动Claude Code,输入提示词。Claude会生成/修改.tsx文件。

步骤2:在已运行的Remotion Studio(localhost:3000)中实时查看效果。得益于React Fast Refresh,代码保存后预览自动更新。

步骤3:不满意?继续对Claude说「这里改一下」:

💬
场景2的打字机速度太快了,每个字符的间隔改为4帧。另外加一个闪烁的光标效果。
💬
场景1的logo出现太突兀了,给spring加上damping: 8让它多弹几下。
💬
给整个视频加上背景音乐,用public/bgm.mp3,从场景1开始播放,在最后1秒淡出。

4.2 资源管理

Remotion中的静态资源放在public/目录,用staticFile()引用:

import { Img, Audio, staticFile } from 'remotion';

// 加载图片
<Img src={staticFile('logo.png')} />

// 加载音频
<Audio src={staticFile('bgm.mp3')} />

// 加载视频素材
<OffthreadVideo src={staticFile('background.mp4')} />

推荐的public/目录结构:

public/
├── images/       # logo、截图、背景图
├── audio/        # BGM、音效
├── videos/       # 视频素材
└── fonts/        # 自定义字体

4.3 音频集成详解

import { Audio, Sequence, staticFile, interpolate, useCurrentFrame } from 'remotion';

// 基础音频
<Audio src={staticFile('audio/bgm.mp3')} />

// 带淡出的BGM
const AudioWithFade = () => {
  const frame = useCurrentFrame();
  const volume = interpolate(
    frame,
    [0, 30, 270, 300],  // 第0-1秒淡入,第9-10秒淡出
    [0, 0.8, 0.8, 0]
  );
  return <Audio src={staticFile('audio/bgm.mp3')} volume={volume} />;
};

第五部分:主题注入系统——让视频风格可复用

如果你要做系列视频,就需要一套一致的视觉风格。最佳实践是抽CSS变量成主题文件:

// src/themes/darkCinema.ts
export const darkCinema = {
  bg: '#0F1923',
  surface: '#141E2B',
  card: '#1A2736',
  cyan: '#13C2C2',
  amber: '#FFB300',
  text: '#E8EDF2',
  textDim: '#7B8FA3',
  fontFamily: 'Noto Sans SC, sans-serif',
  fontMono: 'JetBrains Mono, monospace',
};

在提示词中引用主题:

💬
使用项目中已有的darkCinema主题配色方案。所有颜色从主题对象中读取,不要硬编码颜色值。

这样做的好处:将来换一套配色,只需改一个文件,所有视频的风格立即更新。


第六部分:渲染与导出

6.1 本地渲染

当你对预览满意后:

# 渲染为MP4
npx remotion render src/index.ts MyVideo out/video.mp4

# 指定编码器和质量
npx remotion render src/index.ts MyVideo out/video.mp4 --codec h264 --crf 18

# 渲染为WebM(适合Web嵌入)
npx remotion render src/index.ts MyVideo out/video.webm --codec vp8

# 只渲染静态帧(用作封面图)
npx remotion still src/index.ts MyVideo out/thumbnail.png --frame=45

6.2 渲染速度优化

本地渲染受CPU线程数限制。几个加速技巧:

--concurrency参数设置并行渲染的浏览器实例数(默认是CPU核心数的一半)。用--gl=angle在Linux上启用GPU加速。对于超过1分钟的视频,考虑用Remotion Lambda部署到AWS,1分钟视频约$0.017。

6.3 通过提示词触发渲染

你甚至可以直接在Claude Code中完成渲染:

💬
现在把当前视频渲染成MP4,输出到out/final.mp4,编码用h264,crf设为18。

第七部分:可直接套用的提示词模板库

🎬 YouTube频道片头

创建一个3秒的YouTube频道片头,1920x1080,30fps。

场景:深色背景上,网格线条缓慢流动,发光的频道名logo从粒子
中凝聚成型(用spring动画,damping:10)。最终logo稳定后,底部
出现频道口号(淡入)。
色调:深蓝#0F1923底,cyan#13C2C2主色。
logo图片:public/images/logo.png

📱 竖屏短视频模板

创建5秒竖屏视频,1080x1920,30fps。展示一个概念。

场景1(0-2秒):大标题“你还在手动剪视频?”从下方spring弹入。
场景2(2-4秒):标题换成“让AI帮你做”,配辅动态图标。
场景3(4-5秒):二维码+“关注黑粉科技”。
风格:干净极简,白底黑字,cyan强调色。

📊 数据可视化视频

创建8秒的数据统计动画视频,1920x1080,30fps。

内容:展示三个数字指标,每个用spring动画从0滚到目标值。
指标数据:
- 用户数:128,000
- 视频播放量:2,450,000
- 平均观看时长:4.2分钟

用stagger动画,每个指标比前一个晚15帧出现。
数字滚动用Math.floor(interpolate(spring, [0,1], [0, targetValue]))实现。
每个指标带一个微妙的底部进度条动画。
风格:深色背景,cyan强调色。

💻 终端打字机动画

创建6秒的终端风格代码打字动画,1920x1080,30fps。

模拟终端界面:深色背景,绿色等宽字体。
逐字符显示以下内容:
$ npx create-video my-project
✓ Created project successfully
$ cd my-project && npm start
✓ Studio running at localhost:3000

每个字符间隔3帧,行间间隔15帧。
光标用一个闪烁的方块表示,每15帧切换显示/隐藏。
打字完成后光标继续闪烁1.5秒。

第八部分:进阶技巧

8.1 提示词链——增量迭代而非一次性生成

单次提示词不要太贪心。最有效的方式是链式迭代:

第一步:“创建基础结构,先只要背景和场景切换”

第二步:“现在给场景1加上logo动画”

第三步:“场景2加入打字机效果”

第四步:“加背景音乐和淡出”

第五步:“微调时间节奏,场景1缩短0.5秒”

8.2 组件复用

当你积累了几个视频后,告诉Claude抽取可复用组件:

💬
把当前的打字机动画抽取成一个通用组件 TypewriterText,接受props:
  • text: string — 要显示的文字
  • charDelay: number — 每个字符的帧间隔
  • cursorBlink: boolean — 是否显示闪烁光标
  • color: string — 文字颜色

放到src/components/目录下。

8.3 参数化视频——批量生产

Remotion的杀手锧是参数化。你可以通过inputProps传入不同数据,用同一套模板批量生成不同内容的视频:

# 传入不同props渲染不同版本
npx remotion render src/index.ts MyVideo out/ep01.mp4 \
  --props='{"title":"第1期","topic":"AI视频生成"}'

npx remotion render src/index.ts MyVideo out/ep02.mp4 \
  --props='{"title":"第2期","topic":"Remotion实战"}'

这意味着你可以用一个脚本自动生成整个系列的片头、片尾、过场动画。

8.4 Stills——用视频代码生成封面图

Remotion的一个隐藏功能:用同一套代码生成视频封面图。视频设计更新时,封面自动同步更新:

import { Still } from 'remotion';

// 在Root.tsx中注册
<Still
  id="Thumbnail"
  component={ThumbnailComponent}
  width={1280}
  height={720}
/>

然后用命令导出:

npx remotion still src/index.ts Thumbnail out/thumbnail.png

第九部分:常见问题与避坑指南

问题1:Claude生成的动画在渲染后闪烁或丢帧

原因:用了CSS transition或setTimeout而不是useCurrentFrame。解决:确保Agent Skills已安装,并在提示词中明确要求“所有动画必须基于useCurrentFrame驱动”。

问题2:复杂动画元素位置不对

解决:保持简单。一次只做一个简单的动画概念,迭代叠加。不要试图一次提示词生成复杂的多层叠加动画。

问题3:字体在渲染时缺失

解决:用Remotion内置的Google Fonts加载器,或把字体文件放到public/fonts并用@font-face加载。

问题4:渲染耗时太长

解决:降低分辨率做测试(先用960x540),最终版本再用全分辨率。另外确认没有使用未优化的大图片。


总结:这套管线的价值

Remotion + Claude Code + Agent Skills这套组合拳的核心价值是:

100%可复现:同样的代码永远产出同样的视频,不像AI生成视频的随机性。

可版本控制:视频是代码,可以git跟踪、分支、回滚。

可参数化批量生产:一套模板生产整个系列的视频。

学习曲线近乎为零:有了Agent Skills,你甚至不需要会React,用自然语言描述就能出片。

这不是取代Premiere或After Effects——而是取代「为了做一个15秒片头而打开一个巨无霸的软件」这件事。


黑粉科技 — 用 AI 变强
让普通人也能驾驭 AI。掌握 AI 的人,将成为各个领域的王者。
官网:hyphentech.top
分享到:

相关文章

返回首页