1. 从video-use这个模糊标题说起我到底想解决什么问题第一次看到video-use这个标题加上空白的正文和关键词我脑子里其实也愣了一下。但结合热搜词里那一串Claude Code、ffmpeg、Remotion、Manim我大概能还原出这个项目想干的事用 AI 编程助手Claude Code驱动一套视频处理与生成的工作流把 ffmpeg 的底层处理能力、Remotion 的代码化视频合成、Manim 的数学动画能力串起来让做视频这件事变成写代码这件事。说白了video-use不是一个具体的库而是一种工作范式——把视频当作代码产物来对待。你不再打开剪辑软件拖时间轴而是写一段脚本、跑一条命令、让 AI 帮你补全中间那些繁琐的参数最后渲染出成品。这套东西适合谁我梳理了一下大概三类人最需要程序员/技术博主想批量生成演示视频、代码讲解动画、数据可视化短片但不想学 Premiere 或 AE。做自动化内容的人需要把一堆素材按规则拼接、转码、加水印、切片靠手工根本做不完。研究/教学场景用 Manim 做数学、物理、算法动画追求精确可控的矢量输出。不适合谁如果你只是想剪个 vlog、加个滤镜、配个 BGM那老老实实用剪映或者达芬奇别折腾命令行。这套工作流的价值在于可复现、可批量、可版本控制而不是好看。我下面会把这套东西拆成几块讲先讲清楚为什么是这几个工具组合再讲 ffmpeg 这个地基怎么打然后是 Remotion 和 Manim 各自的分工接着是 Claude Code 怎么当胶水把流程串起来最后是我踩过的坑和排查思路。全程按我实际操作的顺序来你能直接抄。2. 为什么是 ffmpeg Remotion Manim 这个组合而不是别的2.1 三个工具各自守着自己的能力边界很多人一上来就想找一个全能视频库结果发现根本不存在。视频这件事本身就是分层的底层是编解码和容器中层是合成与渲染上层是内容生成逻辑。这三个工具刚好卡在这三层上。ffmpeg 是地基。它管的是最脏最累的活解码、编码、封装、转码、裁剪、拼接、抽帧、推流、滤镜链。你几乎找不到第二个能覆盖这么多格式和编解码器的工具。它的定位是视频界的瑞士军刀但代价是命令行参数极其反人类一个-vf滤镜链能写出花来。Remotion 是中层合成。它用 React 组件来描述视频画面每一帧就是一个 React 渲染结果。这意味着你可以用写网页的方式写视频CSS 动画、组件复用、props 传参、TypeScript 类型检查全都用得上。它底层其实还是调用 Chromium 截图 ffmpeg 编码但把帧这个概念抽象成了组件。Manim 是上层内容生成。它专门做数学动画用 Python 描述几何对象和变换输出精确的矢量动画。3Blue1Brown 那些视频就是它做的。它的强项是精确和可编程弱项是通用性——你拿它做产品宣传片会很痛苦。2.2 组合起来解决的是分工问题我举个实际例子你就明白了。假设我要做一个讲解快速排序算法的视频排序过程的动画演示 →Manim负责因为要精确控制每个元素的移动轨迹。片头片尾、字幕条、进度提示 →Remotion负责因为这些都是模板化的 UI 元素用 React 组件写最舒服。把 Manim 输出的片段和 Remotion 输出的片段拼起来、统一转码、加背景音乐、压制成 MP4 →ffmpeg负责。三者各司其职谁也别抢谁的活。如果你硬要用 Remotion 做数学动画会发现坐标计算极其痛苦硬要用 Manim 做 UI会发现排版能力几乎为零。2.3 一张表看清三者的取舍维度ffmpegRemotionManim核心能力编解码/转码/滤镜组件化视频合成数学动画生成输入方式命令行参数React/TSX 代码Python 代码学习曲线陡参数多中会 React 就行中会 Python 就行输出控制粒度帧/流级别帧级别对象级别适合场景批处理、转码、拼接模板视频、数据驱动视频教学动画、算法演示不适合场景复杂视觉设计精确数学动画通用 UI 排版提示不要试图用一个工具解决所有问题。我见过太多人非要用 Remotion 做数学动画最后坐标算到崩溃。工具选型的第一原则是让每个工具做它最擅长的事。2.4 Claude Code 在这里扮演什么角色Claude Code 不是视频工具它是流程编排的加速器。这套工作流最大的痛点是ffmpeg 参数记不住、Remotion 组件写起来啰嗦、Manim 的 API 要查文档。Claude Code 的价值在于你用自然语言描述需求它帮你生成 ffmpeg 命令。你描述视频结构它帮你搭 Remotion 组件骨架。你描述动画逻辑它帮你写 Manim 场景类。但注意它生成的东西必须你来验证。ffmpeg 参数错一个字符就可能报Invalid argumentManim 的坐标写错就是一片空白。AI 是加速器不是替代品。3. ffmpeg 这层地基安装、核心命令与那些反直觉的参数3.1 安装这件事Windows 和 Ubuntu 差别很大Windows 下我强烈建议直接去官网下ffmpeg-master-latest-win64-gpl.zip这种预编译包解压后把bin目录加到系统 PATH 里。别去下那些来路不明的安装包很多捆绑了垃圾软件。加完 PATH 后开个新终端敲ffmpeg -version能出版本号就成。Ubuntu 下apt install ffmpeg是最省事的但要注意源里的版本可能偏老。如果你需要最新的编解码器支持比如某些新的硬件加速就得自己编译。编译这事坑很深尤其是要交叉编译到 Android 的时候x264 和 ffmpeg 的编译顺序、NDK 版本、ABI 配置任何一个错了都白干。我个人的建议是除非你明确需要某个新特性否则用系统包管理器的版本就够了。注意重装系统后 ffmpeg 命令找不到99% 是 PATH 没配。别急着重装先echo $PATHLinux/Mac或echo %PATH%Windows看看 bin 目录在不在里面。3.2 几条我每天都在用的核心命令转码最基础ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4这里-crf 23是质量参数范围 0-51数字越小质量越高体积越大。23 是默认值我一般用 18-23 之间。-preset控制编码速度从ultrafast到veryslow越慢压缩率越高。日常用medium就行。裁剪时间片段ffmpeg -ss 00:01:30 -i input.mp4 -t 30 -c copy output.mp4-ss是起始时间-t是持续时长。关键在-c copy它表示不重新编码直接复制流速度快到飞起。但注意-ss放在-i前面是快速定位可能不准放在后面是精确裁剪但慢。我一般放前面够用。拼接多个视频# 先创建一个 list.txt # file part1.mp4 # file part2.mp4 ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4拼接的前提是所有片段的编码参数一致否则会出问题。如果参数不一致就得先统一转码再拼。抽帧ffmpeg -i input.mp4 -vf fps1 frame_%04d.pngfps1表示每秒抽一帧%04d是四位序号。做视频封面或者缩略图的时候特别有用。3.3 滤镜链ffmpeg 最强大也最劝退的部分滤镜链用-vf视频和-af音频指定多个滤镜用逗号分隔。比如缩放加水印ffmpeg -i input.mp4 -vf scale1280:720,drawtexttextMyLogo:x10:y10:fontsize24:fontcolorwhite output.mp4scale是缩放drawtext是加文字。这里有个坑drawtext需要字体文件支持Windows 下经常报找不到字体。解决办法是显式指定fontfile参数指向一个 ttf 文件。滤镜链的执行顺序是从左到右所以scale在前drawtext在后文字是在缩放后的画面上加的。如果你反过来文字会被一起缩放可能糊掉。3.4 推流场景下的延迟问题热搜词里有个ffmpeg 推流到 srs 存在延迟这个我踩过。延迟的来源通常有三个编码缓冲-preset越慢缓冲越大。推流场景建议用ultrafast或veryfast。GOP 大小关键帧间隔太大播放器要等很久才能起播。用-g参数控制一般设成帧率的 2 倍。缓冲参数加-tune zerolatency能显著降低延迟这是专门为实时场景准备的。ffmpeg -re -i input.mp4 -c:v libx264 -preset ultrafast -tune zerolatency -g 50 -c:a aac -f flv rtmp://your-server/live/stream-re表示按原始帧率读取模拟实时输入。不加这个ffmpeg 会以最快速度推完服务器直接懵。4. Remotion用写 React 的方式写视频4.1 它到底解决了什么痛点传统视频制作是时间轴思维你在软件里拖拽素材设置关键帧预览导出。问题是这套流程不可复现、不可批量、不可版本控制。你改了 10 个视频里的同一个片头得手动改 10 次。Remotion 把视频变成组件思维一个视频就是一个 React 组件树每一帧是组件在某个时间点的渲染结果。你想改片头改一个组件所有用到它的视频全变。你想批量生成 100 个视频写个循环传不同的 props 就行。4.2 核心概念Composition、Sequence、useCurrentFrameComposition是视频的顶层容器你在这里定义视频的宽高、帧率、时长import { Composition } from remotion; import { MyVideo } from ./MyVideo; export const RemotionRoot () { return ( Composition idMyVideo component{MyVideo} durationInFrames{300} fps{30} width{1920} height{1080} / ); };durationInFrames{300}配合fps{30}就是 10 秒的视频。Sequence用来控制时间轴上的片段from是起始帧durationInFrames是持续帧数Sequence from{0} durationInFrames{90} Intro / /Sequence Sequence from{90} durationInFrames{210} MainContent / /SequenceuseCurrentFrame是动画的核心它返回当前帧号你用它来驱动各种属性const frame useCurrentFrame(); const opacity interpolate(frame, [0, 30], [0, 1]);这段代码的意思是第 0 帧透明度 0第 30 帧透明度 1中间线性插值。interpolate是 Remotion 提供的插值函数还能加extrapolateLeft和extrapolateRight控制超出范围的行为。4.3 一个完整的淡入淡出组件import { useCurrentFrame, interpolate, AbsoluteFill } from remotion; export const FadeIn ({ children, duration 30 }) { const frame useCurrentFrame(); const opacity interpolate(frame, [0, duration], [0, 1], { extrapolateRight: clamp, }); return ( AbsoluteFill style{{ opacity, justifyContent: center, alignItems: center }} {children} /AbsoluteFill ); };AbsoluteFill是 Remotion 提供的全屏容器相当于position: absolute; inset: 0。extrapolateRight: clamp保证透明度不会超过 1。4.4 渲染与 ffmpeg 的衔接Remotion 渲染命令是npx remotion render它内部会启动一个 Chromium 实例逐帧截图然后用 ffmpeg 编码成视频。你可以通过--codec指定编码器通过--crf控制质量。npx remotion render MyVideo out/video.mp4 --codech264 --crf18渲染出来的 MP4 如果要和 Manim 的输出拼接就回到 ffmpeg 的 concat 流程。这就是为什么我说 ffmpeg 是地基——它永远是最后一环。提示Remotion 渲染很吃内存尤其是高分辨率长视频。我建议分块渲染再拼接别一次性渲染 10 分钟 4K 视频机器会哭。5. Manim数学动画的精确控制5.1 安装与版本选择Manim 有两个主要分支manimgl3b1b 原版和manim社区版也叫 ManimCE。新手直接用社区版文档全、社区活跃、pip 装起来省事pip install manim装完后manim --version验证。如果报缺少依赖比如 cairo、pangoLinux 下用 apt 装Windows 下建议用 conda 或者直接下预编译的 wheel。5.2 一个最小可用的场景from manim import * class HelloManim(Scene): def construct(self): text Text(Hello, Manim!) self.play(Write(text)) self.wait(1) self.play(FadeOut(text))construct是每个场景的入口self.play播放动画self.wait暂停。渲染命令manim -pql hello.py HelloManim-p是渲染后自动播放-ql是低质量快速预览。正式输出用-qh高质量或-qk4K。5.3 坐标系与定位新手最容易懵的地方Manim 的坐标系是以屏幕中心为原点x 轴向右为正y 轴向上为正。默认画面高度是 8 个单位宽度根据宽高比自动算16:9 的话是 14.22。dot Dot(point[0, 0, 0]) # 屏幕中心 dot2 Dot(point[3, 2, 0]) # 右上方向 dot3 Dot(point[-3, -2, 0]) # 左下方向UP、DOWN、LEFT、RIGHT是方向常量ORIGIN是原点。定位对象时用.to_edge()、.to_corner()、.next_to()这些方法比手算坐标方便得多。5.4 和 Remotion 的协作方式Manim 输出的是独立的 MP4 片段Remotion 输出的是另一批片段两者通过 ffmpeg 拼接。这里有个细节要注意Manim 默认输出可能带透明通道如果用了-t参数而 Remotion 输出通常是不透明的。拼接前要统一格式否则会出问题。我一般的做法是Manim 用-qh输出标准 MP4Remotion 也用标准 MP4然后 ffmpeg concat。如果需要叠加比如 Manim 动画叠在 Remotion 背景上就用 ffmpeg 的overlay滤镜。6. Claude Code 当胶水怎么把三个工具串成一条流水线6.1 安装与基础配置Claude Code 的安装方式取决于你的平台。npm 用户直接npm install -g anthropic-ai/claude-code装完后在项目目录里跑claude就能启动。VS Code 用户也可以装对应的扩展在编辑器里直接调用。注意部分地区可能无法直接使用具体以官方支持列表为准。如果遇到不可用提示检查一下网络环境和账号状态。6.2 用自然语言生成 ffmpeg 命令这是我最常用的场景。比如我想把一批视频统一转成 720p 并加同样的水印直接跟 Claude Code 说帮我把当前目录下所有 mp4 转成 720p加一个右下角的水印 logo.png输出到 output 目录它会生成类似这样的脚本mkdir -p output for f in *.mp4; do ffmpeg -i $f -vf scale-2:720,overlayW-w-10:H-h-10 -c:v libx264 -crf 23 output/$f done注意scale-2:720里的-2它表示宽度按比例自动算且保证是偶数编码器要求。这个细节很多人不知道直接写-1可能出奇数宽度导致编码失败。6.3 生成 Remotion 组件骨架你可以描述视频结构让 Claude Code 帮你搭组件帮我写一个 Remotion 组件包含一个从左侧滑入的标题2 秒后淡出然后出现三行列表项依次淡入它会生成带Sequence、interpolate、spring的完整代码。但你必须自己调参数因为 AI 不知道你的品牌色、字体、节奏偏好。6.4 生成 Manim 场景Manim 的 API 比较多Claude Code 在这块帮助很大。比如帮我写一个 Manim 场景画一个圆然后把它变成正方形再分裂成四个小圆它会生成用Transform、ReplacementTransform、VGroup的代码。但坐标和时长还是要你自己调AI 给的默认值往往节奏不对。6.5 把三者串起来的编排脚本我一般会写一个build.sh把整个流程串起来#!/bin/bash set -e # 1. 渲染 Manim 片段 manim -qh --disable_caching scenes/algorithm.py SortDemo # 2. 渲染 Remotion 片段 npx remotion render Intro out/intro.mp4 npx remotion render Outro out/outro.mp4 # 3. 拼接 cat list.txt EOF file media/videos/algorithm/1080p60/SortDemo.mp4 file out/intro.mp4 file out/outro.mp4 EOF ffmpeg -f concat -safe 0 -i list.txt -c copy final.mp4set -e保证任何一步失败就停止避免生成半成品。这个脚本可以纳入 git 管理每次改内容重新跑一遍就行。7. 我踩过的坑与排查链路7.1 ffmpeg 报 Invalid argument 的完整排查过程这个错误我遇到过不下十次原因五花八门。我的排查顺序是第一步看完整错误信息。ffmpeg 的报错往往在最后几行前面是正常的流信息。别只看最后一句往上翻。第二步检查参数拼写。-crf写成-crff、-vf写成-vff都会报这个。尤其是从网上抄命令的时候很容易带错。第三步检查滤镜语法。滤镜链里的引号、逗号、冒号特别容易出错。比如drawtext里的文字如果包含冒号必须转义。我建议复杂滤镜先用简单输入测试逐步加参数。第四步检查输入文件。有时候是输入文件本身损坏或者格式不支持。用ffprobe input.mp4看看能不能正常读出信息。第五步检查编码器可用性。ffmpeg -encoders | grep h264看看你要用的编码器在不在。有些预编译包不带某些编码器。7.2 Remotion 渲染出来是黑屏这个坑我踩过。原因通常是组件在某一帧返回了 null 或者空内容。Remotion 不会报错直接渲染成黑屏。排查方法用npx remotion studio打开预览拖动时间轴看哪一帧开始变黑。定位到具体帧后检查那个时间点的Sequence是否已经结束、interpolate是否返回了非法值。另一个常见原因是CSS 单位问题。Remotion 渲染时用的是 Chromium某些 CSS 特性比如vh、vw在渲染环境下表现可能和浏览器不一致。建议用像素值或者百分比。7.3 Manim 渲染出来一片空白Manim 空白输出的原因通常是对象被添加到了场景外或者动画时长为 0。检查方法先用-ql低质量快速渲染看输出。如果空白在construct里加self.add(obj)直接显示对象不加动画确认对象位置对不对。如果对象在画面外调整坐标。还有一个坑是self.play的时长参数。self.play(Write(text), run_time0)会导致动画瞬间完成看起来像没渲染。检查所有run_time是否合理。7.4 拼接后音画不同步这是 ffmpeg concat 的经典问题。原因是各片段的时间基timebase不一致。解决办法是拼接前统一转码ffmpeg -i input.mp4 -c:v libx264 -c:a aac -ar 44100 -r 30 normalized.mp4-ar 44100统一音频采样率-r 30统一帧率。所有片段都过一遍这个命令再 concat 就不会不同步了。7.5 Claude Code 生成的代码跑不通AI 生成的代码有个通病看起来对但细节错。比如 ffmpeg 参数顺序不对、Remotion 的 import 路径不对、Manim 的类名拼错。我的习惯是先小范围测试再全量应用。AI 给了一段 ffmpeg 命令先拿一个 5 秒的小文件跑一遍确认没问题再用到批量脚本里。AI 给的 Remotion 组件先单独渲染 3 秒看看效果再集成到主视频。提示把 AI 当成一个知道很多但不够细心的同事。它给你的东西是草稿不是成品。验证这一步永远不能省。8. 一些让流程更顺的个人经验8.1 目录结构要提前规划我现在的项目目录长这样video-project/ ├── scenes/ # Manim 场景 ├── remotion/ # Remotion 项目 ├── assets/ # 素材图片、音频、字体 ├── output/ # 中间产物 ├── final/ # 最终成品 └── build.sh # 编排脚本分开管理的好处是清理中间产物不会误删源码git 忽略规则也好写。8.2 缓存策略Manim 有缓存机制改了一行代码重新渲染时没变的部分会复用缓存。但有时候缓存会导致改了没生效的错觉。我的做法是调试阶段用--disable_caching正式渲染时开缓存。Remotion 也有类似机制--concurrency参数控制并行渲染的帧数。机器好的话调高能显著加速但内存不够会崩。8.3 版本锁定这三个工具都在快速迭代API 经常变。我强烈建议在项目里锁定版本Manim 用requirements.txtRemotion 用package.json的精确版本号ffmpeg 记录编译参数。否则半年后回来跑可能一堆报错。8.4 关于要不要学的判断最后说点实在的。这套工作流的学习成本不低ffmpeg 参数要记、Remotion 要会 React、Manim 要会 Python、Claude Code 要会提问。如果你只是偶尔做个视频投入产出比不高。但如果你符合下面任何一条我觉得值得投入你需要批量生成结构相似的视频比如每周的数据报告视频。你需要精确控制每一帧的内容比如教学动画。你希望视频制作可版本控制、可复现比如团队协作。你想把视频生成接入自动化流程比如 CI/CD 里自动出片。我自己的体会是前期搭环境、踩坑确实烦但一旦流水线跑通后面做视频的速度是手工剪辑的十倍不止。尤其是改需求的时候——手工剪辑要重剪代码化流程改个参数重跑就行。这套东西的本质是把视频从手工制品变成软件产物。想清楚这一点很多设计选择就顺理成章了。
阅读完成 · 觉得有帮助?