remotion-video
使用 Remotion 框架以编程方式创建视频。Remotion 让你用 React 组件定义视频内容,支持动画、字幕、音乐可视化等。 触发词: - "用代码做视频"、"编程视频"、"React 视频" - "Remotion"、"remotion" - "/remotion-video" 适用场景: - 程序化视频:(1) 批量生成 (2) 数据驱动(如年度总结)(3) 音乐可视化 (4) 自动字幕 - 教程讲解视频:(5) 技术概念可视化(如 CNN、算法)(6) 分层递进讲解 (7) AI 配音教程 - 3D 视频:(8) 产品展示/模型动画 (9) 卡通角色讲解 (10) 3D 数据可
By wshuyi · 997 installs
npx skills add wshuyi/remotion-video-skill --skill remotion-video
Source repository · Upstream listing
Remotion Video
用 React 以编程方式创建 MP4 视频的框架。
核心概念
1. Composition 视频的定义(尺寸、帧率、时长)
2. useCurrentFrame() 获取当前帧号,驱动动画
3. interpolate() 将帧号映射到任意值(位置、透明度等)
4. spring() 物理动画效果
5. <Sequence 时间轴上排列组件
快速开始
创建新项目
选择模板后:
项目结构
基础组件示例
最小视频组件
注册 Composition
动画技巧
interpolate 值映射
spring 物理动画
Sequence 时间编排
AI 语音解说集成
为视频添加 AI 语音解说,实现音视频同步。支持两种方案:
方案 优点 缺点 硬件要求 推荐度
MiniMax TTS 云端克隆、速度极快(<3秒)、音质优秀 按字符计费 无 ⭐⭐⭐ 首选
Edge TTS 零配置、免费 固定音色、无法自定义 无 ⭐⭐
方案选择流程
方案一:MiniMax TTS(推荐)
云端 API 方案,无需本地 GPU,生成速度极快,音色克隆效果优秀。
配置
1. 注册 https://www.minimax.io (国际版)或 https://platform.minimaxi.com (国内版)
2. 获取 API Key
3. 在 MiniMax Audio 上传音频克隆音色,获取 voice id
API 差异
版本 API 域名 说明
国际版 api.minimax.io 推荐,稳定
国内版 api.minimaxi.com 需国内账号
⚠️ 常见错误 : api.minimax.chat 是 错误的域名 ,会返回 "invalid api key"。请确认使用上表中的正确域名。
生成脚本
使用 scripts/generate audio minimax.py 生成音频,支持:
断点续作 :已存在的音频文件自动跳过
实时进度 :显示生成进度,避免茫然等待
自动更新配置 :生成完成后自动更新 Remotion 的场景配置
价格参考(2025年)
模型 价格
speech 02 hd ¥0.1/千字符
speech 02 turbo ¥0.05/千字符
⚠️ MiniMax TTS 踩坑经验
问题 原因 解决方案
invalid api key 使用了错误的 API 域名 国际版用 api.minimax.io ,国内版用 api.minimaxi.com
config.ts 语法错误 Syntax error "n" Python 脚本在 f string 中用 ",\\n".join() 产生了字面量 \n 而非真正换行 见下方「Python 生成 TypeScript 注意事项」
长时间无进度显示 后台执行命令看不到输出 前台执行脚本,或用 tail f 实时查看日志
Python 生成 TypeScript 注意事项
❌ 错误写法 :在 f string 中使用 \n 会产生字面量字符
✅ 正确写法 :分开处理字符串拼接
方案二:Edge TTS
无需特殊硬件,完全免费,适合不需要克隆音色的场景。
安装
推荐语音
语音 ID 名称 风格
zh CN YunyangNeural 云扬 专业播音腔(推荐)
zh CN XiaoxiaoNeural 晓晓 温暖自然
zh CN YunxiNeural 云希 阳光少年
生成脚本
使用 scripts/generate audio edge.py 生成音频:
Remotion 音频同步
教程类视频架构(场景驱动)
教程、讲解类视频的核心架构: 音频驱动场景切换 。
架构概览
关键思想:
1. 音频决定时长 :每个场景的持续时间由音频长度决定
2. 场景即章节 :一个概念 = 一个场景 = 一段音频
3. 配置即真理 : audioConfig.ts 是音画同步的单一数据源
audioConfig.ts 模板
参见 templates/audioConfig.ts ,包含:
SceneConfig 接口定义
SCENES 数组
getSceneStart() 计算函数
TOTAL FRAMES 和 FPS 常量
场景切换 Hook
主场景组件模式
Root.tsx 使用动态帧数
⚠️ 教程视频踩坑经验
问题 原因 解决方案
场景切换生硬 直接切换无过渡 用 spring/interpolate 添加入场动画
3D 内容与音频不同步 硬编码帧数 所有时长从 audioConfig 读取
渲染时 WebGL 崩溃 多个 ThreeCanvas 同时存在 用 sceneIndex 条件渲染,同时只有一个 3D 场景
视频太简略 只有一个大场景 一个概念 = 一个场景组件 ,分层讲解
场景组件设计原则
1. 单一职责 :每个场景组件只负责一个概念
2. 独立动画 :每个场景有自己的 useCurrentFrame(),动画从 0 开始
3. 延迟出现 :用 delay 参数控制元素依次出现
4. 相机适配 :不同场景可能需要不同相机位置
相机控制器模式
⚠️ 不要用 position += (target position) factor 这种写法 ,永远无法精确收敛,会导致画面持续抖动。详见「🚨 3D 场景常见陷阱 陷阱1」。
常用功能
添加视频/音频
添加图片
参数化视频(动态数据)
渲染输出
CLI 渲染
常用渲染参数
参数 说明
codec h264, h265, vp8, vp9, gif, mp3, wav 等
crf 质量 (0 51,越小越好,默认18)
props JSON 格式传入 props
scale 缩放因子
concurrency 并行渲染数
高级功能
字幕 (@remotion/captions)
播放器嵌入 Web 应用
AWS Lambda 渲染
3D 视频制作(@remotion/three)
使用 React Three Fiber 在 Remotion 中创建 3D 动画视频。
适用场景
场景 说明 示例
产品展示 3D 模型旋转、拆解动画 手机产品宣传片
角色动画 卡通角色讲解、故事叙述 育儿科普视频
数据可视化 3D 图表、空间数据 地理信息、建筑展示
Logo 动画 品牌 3D Logo 入场 片头片尾
安装
官方模板 (推荐新手):
基础示例
加载 GLTF 模型
安装 drei (React Three Fiber 工具库):
视频作为 3D 纹理
渲染时使用 useOffthreadVideoTexture() 确保帧精确:
3D 角色组合技巧
用基础几何体组合角色(无需专业建模):
⚠️ 踩坑经验
WebGL 上下文溢出
问题 :多个 3D 场景同时渲染时报错 Error creating WebGL context
原因 :浏览器限制 WebGL 上下文数量(通常 8 16 个)
解决方案 :
1. 渲染配置 :使用 angle OpenGL 引擎
CLI 渲染时:
2. 懒加载场景 :只渲染当前帧附近的 3D 内容
服务端渲染配置
服务端渲染(SSR)必须配置 gl 选项:
Sequence 内的 useCurrentFrame
<Sequence 内部的 useCurrentFrame() 返回的是 相对于 Sequence 开始的帧号 ,不是全局帧号。
进阶资源
资源 用途 链接
Mixamo 免费骨骼动画库 https://www.mixamo.com
Sketchfab 免费/付费 3D 模型 https://sketchfab.com
Ready Player Me 虚拟人物生成 https://readyplayer.me
Spline 在线 3D 设计工具 https://spline.design
gltfjsx GLTF 转 React 组件 npx gltfjsx model.glb
进阶方向
1. Blender → GLTF :用 Blender 建模,导出 GLTF 格式,用 useGLTF 加载
2. Mixamo 动画 :下载 FBX 动画,转换为 GLTF,用 useAnimations 播放
3. Spline 设计 :在 Spline 设计 3D 场景,用 @splinetool/r3f spline 导入
3Blue1Brown 风格指南(教程类视频)
针对教程、讲解类视频,借鉴 3Blue1Brown 的可视化设计原则。
核心理念
原则 说明 示例
Why → What 先提问为什么,再展示是什么 "如何识别手写数字?" → 展示神经网络
逐步构建 元素一个个出现,不要整体淡入 神经元依次点亮,而非同时出现
颜色有语义 颜色传达信息,不是装饰 蓝=正、红=负、黄=高亮
数值具象化 显示具体数字让抽象概念落地 像素值 0.7、激活值 0.92
2D 优先 清晰优先于炫酷,必要时才用 3D 网络结构用 2D,空间数据用 3D
配色方案
2D/3D 混合策略
内容类型 推荐维度 原因
网络结构图 2D 层次清晰,易于标注
数据流向 2D + 动画箭头 强调顺序和因果
卷积操作 2D 俯视图 网格对齐,数值可见
特征图堆叠 2.5D(透视) 展示深度/通道数
3D 物体识别 3D 内容本身是 3D
2D 模式实现 :使用正交相机 + 扁平几何体
逐步构建动画
核心 :用 delay 参数控制元素依次出现
数值标签组件
高亮焦点组件
脚本撰写指南(教程类)
❌ 宣布式(避免) :
✅ 探索式(推荐) :
脚本结构模板 :
⚠️ 常见误区
误区 问题 改进
3D 炫技 旋转、透视分散注意力 用最简单的视角表达
颜色随意 红绿蓝只是装饰 建立颜色 含义映射
整体出现 观众不知道看哪里 逐个元素 + 高亮引导
只说 What 观众不理解设计动机 先问 Why 再展示 What
信息过载 一个场景塞太多概念 一个场景一个概念
过程动画模式(Process Animation)
核心理念 :不只展示「是什么」,更要展示「怎么算」。让观众亲眼看到数据如何流动、计算如何发生。
适用场景
场景 说明 示例
算法可视化 展示每一步操作 排序、搜索、图遍历
数学公式推导 逐项展开计算 矩阵乘法、卷积运算
数据处理流程 输入→变换→输出 CNN 前向传播、数据清洗
决策过程 比较、筛选、最终选择 池化取最大值、softmax
动画模式分类
过程动画组件库
1. 计算步骤展示(StepByStep)
2. 数值飞入动画(ValueFlyIn)
3. 区域高亮比较(CompareHighlight)
4. 滑动窗口(SlidingWindow)
脚本撰写指南(过程动画版)
关键转变 :脚本需要配合动画节奏,给动画「留白时间」。
❌ 传统脚本(信息密集) :
✅ 过程动画脚本(留白配合) :
时间分配建议
详细程度 首次完整展示 重复加速 适用场景
极详细 3 4 秒/步 0.5 秒/步 核心概念首次出现
中等 2 秒/步 0.3 秒/步 辅助概念
快速 1 秒/步 闪过 已解释过的重复
示例:卷积场景时间分配
⚠️ 过程动画踩坑经验
问题 原因 解决方案
动画太快看不清 时间分配不足 增加关键步骤的帧数
解说与动画不同步 脚本没有留白 重写脚本,加入停顿标记
信息过载 一次展示太多 分阶段:先结构,再过程
重复内容无聊 每次都详细展示 首次详细 + 后续加速
数值太小看不见 3D 文字渲染问题 用 2D HTML overlay
相机持续抖动 插值永不收敛 见下方「相机控制陷阱」
图像旋转90度 行列坐标映射反了 见下方「网格坐标陷阱」
进度显示好几千% progress 变量未 clamp Math.min(1, (frame start) / duration)
特征图只有色块无数值 组件缺少数值显示功能 添加 values + showValues 参数
进度变量必须 clamp
特征图显示计算结果
🚨 3D 场景常见陷阱
陷阱 1:相机持续抖动
症状 :画面一直微微放大 缩小抖动
错误写法 :
正确写法 :
陷阱 2:网格图像旋转90度
症状 :本应显示为正常方向的图像(如数字7)被旋转了90度
根因 :图像处理中 row 对应 y 轴(从上到下), col 对应 x 轴(从左到右),
但代码里把行索引映射到了 x 坐标,列索引映射到了 y 坐标。
错误写法 :
正确写法 :
记忆口诀 :
图像坐标: image[row][col] = image[y][x] (行是y,列是x)
3D 坐标:x 向右,y 向上
翻转 row:图像 row=0 在顶部,3D y=max 在顶部
工作流最佳实践
推荐的 npm scripts 配置
实时进度显示
音频生成和视频渲染都可能耗时较长, 务必使用前台执行 以便看到进度:
render.sh 示例 :
断点续作设计原则
长时间任务(如批量生成音频)应支持断点续作:
1. 检查已存在文件 :跳过已完成的项目
2. 原子操作 :单个文件生成失败不影响已完成的
3. 进度保存 :失败时保留已完成的部分
4. 幂等执行 :重复运行产生相同结果
调试技巧
1. Studio 热重载 : npm run dev 实时预览
2. 检查帧 :Studio 中拖动时间轴逐帧检查
3. 性能 :避免在组件内做重计算,用 useMemo
4. 静态文件 :放在 public/ 目录,用 staticFile() 引用
常见问题
Q: 视频渲染很慢?
使用 concurrency 增加并行数
降低分辨率测试: scale=0.5
考虑 AWS Lambda 分布式渲染
Q: 字体不显示?
使用 @remotion/google fonts 或本地加载
确保字体在渲染前已加载
Q: 视频素材不播放?
检查视频编码格式(推荐 H.264)
使用 <OffthreadVideo 替代 <Video 提升性能
参考资源
官方文档:https://remotion.dev/docs
模板库:https://remotion.dev/templates
GitHub:https://github.com/remotion dev/remotion