比特之外

从零理解 Remotion:安装项目、认识文件结构、跑起第一个视频

如果你会 React,又想做可复用、可批量生成的视频,Remotion 是一个很自然的选择。它不是让你在网页里嵌播放器或录屏幕,而是让你用 React 组件描述每一帧画面,再把这些画面渲染成视频文件。

这篇文章先不去讲复杂动画。我们先把第一件事讲清楚:一个 Remotion 项目从哪里来,安装后有哪些文件,Root.tsx 为什么重要,以及第一个 Composition 到底是什么。

Remotion 是什么

Remotion 可以理解为"用 React 写视频"的工具链。你写的仍然是组件、props、样式和 TypeScript,但最终产物不是网页,而是视频。

它适合这些场景:

  • 短视频模板
  • 产品介绍视频
  • 口播字幕视频
  • 数据报告视频
  • AI 批量生成视频
  • 需要参数化换标题、换素材、换主题色的视频

传统剪辑软件适合一次性创作。Remotion 更适合把视频做成模板,输入不同数据,生成不同视频。

创建一个 Remotion 项目

新项目可以用官方脚手架创建:

npx create-video@latest

进入项目后安装依赖并启动 Studio:

npm install
npm run dev

npm run dev 会打开 Remotion Studio。你可以把它理解为视频开发时的预览工具,左侧选择 Composition,中间看画面,时间轴上拖动帧号。

如果你使用的是配套课件,已经可以直接运行:

npm run dev

然后在 Studio 左侧选择 LessonCoreBasics

安装后有哪些关键文件

Remotion 项目看起来像一个 React 项目,但有几个文件特别重要。

package.json

package.json 里有项目命令和依赖。常见命令包括:

{
  "scripts": {
    "dev": "remotion studio",
    "build": "remotion bundle",
    "lint": "eslint src && tsc"
  }
}

dev 用来启动 Studio。真正渲染视频时,可以使用:

npx remotion render FinalTalkingVideo

src/index.ts

src/index.ts 是 Remotion 的入口文件。它会把根组件注册给 Remotion。平时你不需要频繁改它,但它是整个项目启动的入口。

src/Root.tsx

src/Root.tsx 是新手最应该先看的文件。它决定 Studio 左侧有哪些视频入口。

在 Remotion 里,一个视频入口叫 Composition。比如:

<Composition
  id="LessonCoreBasics"
  component={CoreBasics}
  durationInFrames={150}
  fps={30}
  width={1920}
  height={1080}
/>

这段配置的意思是:

  • id:Composition 的名字,Studio 左侧会显示它,命令行渲染也会用它。
  • component:真正负责画面的 React 组件。
  • durationInFrames:视频总帧数。
  • fps:每秒多少帧。
  • width / height:输出尺寸。

这里 durationInFrames={150},fps={30},所以这个视频时长是 5 秒。

src/lessons/CoreBasics.tsx

Root.tsx 只负责注册入口。真正显示画面的代码在 src/lessons/CoreBasics.tsx

这个文件是第一节课的画面组件,它显示标题和四张概念卡片,帮助你认识 CompositionfpsframeSequence

public/

public/ 放静态素材,例如图片、音频、视频。配套课件里有一个口播音频:

public/audio/talking-demo.wav

在 Remotion 组件里可以用 staticFile() 引用它。

remotion.config.ts

remotion.config.ts 是 Remotion 配置文件。比如这套课件里启用了 Tailwind 和 Skia 支持:

Config.overrideWebpackConfig((currentConfiguration) => {
  return enableSkia(enableTailwind(currentConfiguration));
});

新手一开始不需要深入配置文件,但要知道它会影响打包和渲染。

什么是 Composition

Composition 是 Remotion 的视频入口。你可以把它理解为"一个可以预览和渲染的视频模板"。

一个项目里可以有多个 Composition。比如这套课件里有:

  • LessonCoreBasics
  • LessonAnimationMethod
  • LessonLottieEcosystem
  • LessonThreeEcosystem
  • FinalTalkingVideo

这意味着你可以在同一个项目里同时维护很多视频模板。

第一段代码:CoreBasics 做了什么

打开 src/lessons/CoreBasics.tsx,你会看到:

const frame = useCurrentFrame();

这行代码会拿到当前正在渲染的帧号。如果你在 Studio 里拖到第 60 帧,frame 就是 60。

再看:

const blockOpacity = interpolate(frame, [24, 44], [0, 1], {
  extrapolateLeft: "clamp",
  extrapolateRight: "clamp",
});

这段代码把帧号转换成透明度:

  • 第 24 帧之前,透明度是 0。
  • 第 24 到第 44 帧之间,透明度从 0 变成 1。
  • 第 44 帧之后,透明度保持 1。

这就是 Remotion 动画的基本思路:不要让浏览器自己跑动画,而是用当前帧号算出这一帧应该是什么样子。

最后看:

<Sequence from={36}>

Sequence 用来安排内容出现在时间轴上的位置。from={36} 表示里面的内容从第 36 帧开始。

你应该先记住什么

学 Remotion 的第一天,不需要记住所有 API。先记住这条路径:

Root.tsx 注册 Composition
Composition 指向一个 React 组件
组件用 frame 计算画面
Remotion 把每一帧合成视频

这条路径理解了,后面再学字幕、音频、Lottie、Three、Skia、批量渲染,都会更顺。

动手练习

打开 LessonCoreBasics,做两个小改动:

  1. 把四张卡片的顺序前后交换。
  2. 把其中一张卡片的颜色换成黄色。

然后在 Studio 里拖动时间轴。你会发现,只要停在同一帧,画面始终是稳定的。

下一篇我们继续讲这个稳定性的来源:为什么 Remotion 动画必须由 frame 决定。

本文标签

RemotionReactVideo