ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用代码做视频:ffmpeg、Remotion、Manim 与 Claude Code 自动化工作流

用代码做视频:ffmpeg、Remotion、Manim 与 Claude Code 自动化工作流 1. 从video-use这个模糊标题说起它到底想解决什么问题第一次看到video-use这个标题加上一串围绕 Claude Code、ffmpeg、Remotion、Manim 的热搜词我脑子里冒出来的第一个判断是这大概率不是一个具体的开源项目名而是一个围绕用代码来生产视频这件事的方法论集合。换句话说它想回答的核心问题是——当我已经习惯了用命令行、用脚本、用 AI 助手来干活的时候视频这种看起来必须靠剪辑软件拖时间线的东西能不能也纳入同一套工作流答案是能而且比大多数人想象的要顺。我过去两年里陆续用 ffmpeg 做过批量转码和推流、用 Remotion 做过数据驱动的动态视频、用 Manim 做过数学动画也在 Claude Code 这类终端 AI 助手的配合下把整个流程串起来过。踩过的坑不算少但沉淀下来的东西确实值得写一篇完整的总结。这篇内容适合三类人看第一类是有一定命令行基础、想把视频处理自动化的开发者第二类是做数据可视化、教学动画、批量内容生产的内容创作者第三类是已经在用 Claude Code 这类工具、想把它扩展到视频领域的效率玩家。如果你完全没碰过命令行也不用急着关掉我会尽量把每个概念用生活化的方式讲清楚你至少能知道这条路是怎么走的、值不值得走。需要先说明一点video-use本身没有官方定义所以下面所有的架构、流程、参数都是基于一个合格从业者在做视频自动化时最可能采用的合理方案来补全的不是某个特定项目的文档。我会明确标注哪些是通用实践、哪些是我的个人经验。2. 为什么用代码做视频这件事值得认真对待2.1 剪辑软件的隐性成本重复劳动与不可复现大多数人做视频的默认路径是打开剪辑软件导入素材拖到时间线加转场导出。做一条两条没问题但当你需要做 50 条结构相同、只是数据不同的视频时这套流程的代价就暴露出来了。我举个真实场景之前帮朋友做一个每日数据播报的短视频系列模板固定就是标题、几个数字、一段柱状图动画、结尾 logo。用剪辑软件做一条大概 15 分钟50 条就是 12 个多小时而且中间只要有一个数字填错你得重新打开工程文件改、重新导出。更麻烦的是三个月后你想改一下模板的字体前面 50 条全部要重做。这就是不可复现的代价。剪辑软件的时间线是一种手工状态它记录的是你拖拽的结果而不是生成这个结果的规则。而代码做视频的核心优势恰恰在于你写的是规则视频是规则的输出。改规则重新跑一遍所有视频自动更新。2.2 代码化视频的三个层次我把用代码做视频分成三个由浅入深的层次理解这个分层对选型非常关键层次典型工具你控制的是什么适合场景处理层ffmpeg已有视频的转码、裁剪、拼接、推流批量处理、格式转换、直播合成层Remotion用前端技术栈从零渲染视频数据驱动、模板化批量生产动画层Manim用代码描述精确的动画过程数学、算法、教学演示这三层不是互斥的实际项目里经常是组合使用。比如用 Manim 生成一段数学动画用 ffmpeg 把它和实拍素材拼接、加字幕、压制成最终成片整个流程用 Claude Code 写脚本串起来。理解每一层擅长什么、不擅长什么比记住某个命令重要得多。2.3 一个反直觉的结论代码做视频不是更高级而是更适合特定约束我得泼一盆冷水。如果你只是偶尔剪一条 vlog加个背景音乐和滤镜那老老实实用剪辑软件别折腾代码。代码化视频的价值只在特定约束下才成立规模约束需要生产几十上百条结构相似的视频精度约束动画需要精确到帧、到像素、到数学公式复现约束需要版本管理、需要随时重新生成集成约束视频生产需要嵌入到已有的自动化流水线里如果你的需求不落在这些约束里代码化反而是负担。我见过有人为了显得专业硬用 ffmpeg 拼视频结果一个简单的转场调了两小时用剪辑软件三秒搞定。工具选择的第一原则永远是匹配约束而不是追求技术感。3. ffmpeg绕不开的地基但大多数人只用到了皮毛3.1 ffmpeg 到底是个什么东西用一句话说ffmpeg 是一个视频领域的瑞士军刀它能把几乎任何格式的音视频读进来、做各种处理、再以几乎任何格式吐出去。你在剪辑软件里点的导出底层很可能就是 ffmpeg 在干活。它的工作模型其实很清晰理解这个模型很多命令就不用死记了输入-i → 解码 → 滤镜链-vf/-af/-filter_complex → 编码 → 输出-i指定输入文件可以有多个滤镜链是处理的核心视频滤镜用-vf音频用-af复杂的用-filter_complex输出格式由文件扩展名和编码参数决定我刚开始学的时候最大的误区是背命令。后来发现根本不用背只要理解我要对视频做什么处理然后去查对应的滤镜名就行。ffmpeg 的滤镜有几百个没人能全记住。3.2 几个我每天都在用的基础命令先给几个最实用的都是可以直接抄的# 格式转换把 m3u8 转成 mp4热搜里很多人问这个 ffmpeg -i input.m3u8 -c copy output.mp4 # 裁剪从第 10 秒开始截取 30 秒 ffmpeg -ss 00:00:10 -i input.mp4 -t 30 -c copy output.mp4 # 压缩控制码率减小文件体积 ffmpeg -i input.mp4 -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4 # 提取音频 ffmpeg -i input.mp4 -vn -c:a copy output.aac # 拼接多个视频需要先统一格式 ffmpeg -f concat -safe 0 -i filelist.txt -c copy output.mp4这里重点说两个参数因为它们最容易踩坑-c copy是流复制意思是直接搬运原始数据不重新编码。好处是快得离谱几十倍速坏处是只能在不改变编码格式的前提下用。比如你把 h264 的视频-c copy成 mp4 没问题但你想裁剪到非关键帧位置-c copy就会导致开头花屏因为关键帧不在你切的位置。-crf是质量控制参数范围 0-51数字越小质量越高、文件越大。经验值18 接近无损23 是默认的平衡点28 以上肉眼可见变糊。做网络视频我一般用 23做存档用 18。3.3 滤镜链ffmpeg 真正强大的地方单个命令能做的事有限滤镜链才是 ffmpeg 的杀手锏。举个我常用的例子——给视频加水印、缩放、加淡入淡出ffmpeg -i input.mp4 -i logo.png \ -filter_complex [0:v]scale1280:720,fadetin:st0:d1[bg]; \ [bg][1:v]overlayW-w-20:H-h-20 \ -c:a copy output.mp4这条命令做了三件事把主视频缩放到 1280x720、开头 1 秒淡入、把 logo 叠加到右下角距边缘 20 像素。overlay里的W-w-20是表达式W是主视频宽w是 logo 宽算出来就是右下角位置。滤镜链的语法有个关键点方括号里是标签用来在多个滤镜之间传递数据流。[0:v]表示第 0 个输入的视频流[bg]是我自己起的中间标签。理解了这个再复杂的滤镜图都能拆解。3.4 推流为什么会有延迟怎么缓解热搜里有个词是ffmpeg 推流到 srs 存在延迟这个问题我踩过。推流的基本命令是ffmpeg -re -i input.mp4 -c:v libx264 -preset veryfast \ -c:a aac -f flv rtmp://server/live/stream-re是关键它让 ffmpeg 按视频原本的帧率实时读取而不是能多快就多快。不加-re一个 10 分钟的视频可能几秒钟就推完了接收端根本来不及处理。延迟的来源通常有三块编码缓冲、网络传输、播放端缓冲。缓解手段对应也有三个编码端用-preset veryfast甚至ultrafast牺牲压缩率换低延迟配合-tune zerolatency网络端尽量走低延迟协议减少中间环节播放端把缓冲区调小但要注意延迟和稳定性是一对矛盾。你把缓冲压到极低网络一抖动就卡顿。所以实际项目里要找到那个平衡点而不是一味追求最低延迟。3.5 安装与版本选择别在这上面浪费时间ffmpeg 的安装是新手最容易卡住的地方。我的建议很直接Windows去官网下ffmpeg-master-latest-win64-gpl.zip这类预编译包解压后把bin目录加到系统 PATH 就行。别去折腾自己编译除非你有特殊需求。macOSbrew install ffmpeg一条命令搞定。Ubuntu/Debiansudo apt install ffmpeg但注意系统源里的版本可能偏旧需要新特性的话得用官方静态包或 PPA。Android 交叉编译这是进阶需求热搜里那个万字完结篇说的就是这事。核心是先编译 x264 等依赖库再用 NDK 的 toolchain 编译 ffmpeg配置--cross-prefix、--sysroot等参数。这个过程坑极多建议直接找现成的编译脚本改。提示如果你只是做常规的视频处理永远优先用预编译包。自己编译 ffmpeg 是个无底洞除非你要在特定架构比如某些嵌入式板子上跑否则不值得。4. Remotion用写网页的方式做视频4.1 Remotion 的核心思路视频就是随时间变化的 React 组件如果说 ffmpeg 是处理已有视频那 Remotion 就是从零生成视频。它的核心思想非常优雅一个视频本质上就是一系列帧每一帧是一个 React 组件在某个时间点的渲染结果。你写一个 React 组件它接收一个frame参数根据这个帧号决定显示什么。Remotion 会逐帧渲染最后用 ffmpeg 把这些帧合成视频。这意味着你可以用任何前端技术——CSS 动画、SVG、Canvas、甚至引入图表库——来做视频。我第一次用 Remotion 做数据播报视频的时候那种感觉是原来视频可以这么写。数据从 JSON 读进来组件根据数据渲染柱状图动画用interpolate函数控制整个视频就是一个纯函数输入数据输出视频。4.2 一个最小可用的 Remotion 组件import { useCurrentFrame, interpolate, AbsoluteFill } from remotion; export const MyVideo ({ title, value }) { const frame useCurrentFrame(); // 前 30 帧从透明到不透明 const opacity interpolate(frame, [0, 30], [0, 1], { extrapolateRight: clamp, }); // 数字从 0 滚动到目标值 const displayValue Math.round( interpolate(frame, [0, 60], [0, value], { extrapolateRight: clamp }) ); return ( AbsoluteFill style{{ backgroundColor: #0a0a0a, justifyContent: center, alignItems: center }} h1 style{{ color: #fff, opacity }}{title}/h1 p style{{ color: #4ade80, fontSize: 80 }}{displayValue}/p /AbsoluteFill ); };interpolate是 Remotion 里最重要的函数它把帧号映射到任意数值区间。上面这段代码opacity在前 30 帧从 0 变到 1displayValue在前 60 帧从 0 滚到目标值。extrapolateRight: clamp保证超过范围后不再变化。4.3 Remotion 的适用边界什么时候别用它Remotion 很强但不是万能的。我总结了几条别用 Remotion的情况需要处理大量实拍素材Remotion 擅长生成不擅长剪辑实拍。你要拼接一堆手机拍的视频用 ffmpeg 或剪辑软件更合适。需要极高性能的实时渲染Remotion 是逐帧渲染一个 1080p 60 秒的视频可能要渲染几分钟到几十分钟。做实时预览不现实。团队里没人懂 ReactRemotion 的学习曲线主要在前端技术栈上如果团队都是剪辑师强行上 Remotion 会很难受。反过来数据可视化视频、模板化批量生产、需要精确控制每一帧的场景Remotion 是最优解。它的remotion/player还能在网页里嵌入播放器做交互式预览。4.4 和 ffmpeg 的配合Remotion 负责生成ffmpeg 负责收尾实际项目里我经常这样组合Remotion 渲染出无声的视觉部分然后用 ffmpeg 把配音、背景音乐、字幕合进去。这样分工的好处是视觉部分可以独立迭代音频处理用 ffmpeg 的成熟滤镜链各司其职。# 把 Remotion 渲染的视频和音频合并 ffmpeg -i remotion_output.mp4 -i voiceover.aac \ -c:v copy -c:a aac -shortest final.mp4-shortest保证输出时长以较短的流为准避免音频比视频长导致的黑屏尾巴。5. Manim当动画需要精确到数学公式5.1 Manim 的定位为解释性动画而生Manim 最初是 3Blue1Brown 为了做数学讲解视频而开发的。它的核心能力是用代码精确描述几何对象和它们的变换过程。画一个圆、让它变成正方形、标注每个顶点、推导公式——这些在 Manim 里都是几行代码的事。和 Remotion 的区别在于Remotion 更像通用视频生成框架Manim 更像数学动画专用引擎。Manim 内置了大量数学相关的对象坐标系、函数图像、向量场、矩阵以及一套动画编排的语法。5.2 一个 Manim 场景的解剖from manim import * class ShowDerivative(Scene): def construct(self): axes Axes(x_range[-3, 3], y_range[-1, 9]) curve axes.plot(lambda x: x**2, colorBLUE) label axes.get_graph_label(curve, labelf(x)x^2) self.play(Create(axes)) self.play(Create(curve), Write(label)) # 在 x1 处画切线 dot Dot(axes.c2p(1, 1), colorRED) tangent axes.plot(lambda x: 2*x - 1, colorRED, x_range[0, 2]) self.play(FadeIn(dot), Create(tangent)) self.wait()这段代码画了 yx² 的图像然后在 x1 处画切线。construct方法是场景的入口self.play是播放动画self.wait是停顿。Manim 的动画是声明式的——你描述从 A 变到 B它自动生成中间帧。5.3 Manim 的学习曲线与常见误区Manim 的坑主要集中在几个地方第一坐标系转换。Manim 里屏幕坐标和数学坐标是两套系统axes.c2p(x, y)是把数学坐标转成屏幕坐标。新手经常忘记转换导致点画到屏幕外面去了。第二渲染速度。Manim 默认渲染质量很高但速度慢。调试的时候一定要用低质量模式manim -ql scene.py SceneName-ql是 low quality。等确认没问题了再用-qh高质量渲染。第三版本差异。Manim 有社区版Manim Community和原版ManimGL两个分支API 不完全兼容。新手建议直接用社区版文档全、更新活跃。注意Manim 官网的安装说明有时候和实际环境对不上尤其是涉及 LaTeX 的部分。如果你不需要渲染数学公式可以跳过 LaTeX 安装能省不少事。5.4 三层工具的组合实战一条完整的视频生产流水线我把前面三层串起来给你看一个真实项目的流程。需求是做一个算法讲解系列视频每集讲一个排序算法包含算法动画、数据对比图表、配音。流程是这样的Manim 生成算法动画每个排序算法的可视化输出成 mp4Remotion 生成数据图表从 JSON 读性能数据渲染对比柱状图ffmpeg 合成把 Manim 片段、Remotion 片段、配音、背景音乐、字幕按时间线拼接第三步的 ffmpeg 命令会比较复杂用filter_complex做多路拼接ffmpeg -i manim_part.mp4 -i remotion_part.mp4 -i voice.aac -i bgm.aac \ -filter_complex [0:v][1:v]concatn2:v1:a0[v]; \ [2:a][3:a]amixinputs2:durationfirst[a] \ -map [v] -map [a] -c:v libx264 -crf 23 final.mp4concatn2:v1:a0表示拼接两段视频、输出 1 路视频、0 路音频。amix把配音和背景音乐混合durationfirst表示以第一路音频的长度为准。这套流水线跑通之后做一集视频的时间从几小时压缩到改改数据、跑个脚本、十几分钟出片。这就是代码化视频的威力。6. Claude Code 在视频工作流里扮演什么角色6.1 它不是视频工具而是把工具串起来的人Claude Code 这类终端 AI 助手在视频工作流里的价值不是帮你做视频而是帮你写把视频工具串起来的脚本。它的定位更像一个随时在线的、懂 ffmpeg 和 Python 的搭档。我实际用下来的高频场景有这么几个写 ffmpeg 命令我描述需求把目录下所有 mp4 转成 720p 并加同样的水印它直接给出可用的命令甚至 shell 脚本调试滤镜链滤镜链报错信息很晦涩把错误贴给它它能指出是哪个标签没对上写 Remotion/Manim 组件描述想要的动画效果它生成初版代码我再微调批量处理脚本把一堆零散操作组织成可复用的 Python 脚本6.2 安装与配置几个容易卡住的点Claude Code 的安装本身不复杂但有几个点新手容易卡Node.js 版本它依赖较新的 Node装之前先node -v确认版本够新PATH 配置全局安装后如果命令找不到多半是 npm 全局 bin 目录没在 PATH 里VS Code 集成在 VS Code 里用的话装对应扩展然后在集成终端里调用比单独开终端方便卸载npm uninstall -g对应包名即可但记得清理配置文件残留提示如果你在配置过程中遇到当前地区不可用之类的提示这属于服务可用性范畴不是技术问题换个思路用其他方式完成同样的工作即可不必在这上面纠结。6.3 怎么喂需求才能让它产出可用的视频脚本这是我想重点讲的因为同样一个 AI 助手会不会用差别巨大。我的经验是给视频相关的需求一定要包含这几个要素输入是什么文件格式、分辨率、时长、数量输出要什么格式、编码、分辨率、命名规则中间做什么处理转码、裁剪、加水印、拼接、混音约束条件性能要求、质量要求、兼容性要求举个例子模糊的需求是帮我把视频处理一下它只能给你泛泛的建议。清晰的需求是目录下有 30 个 4K 的 mp4我要批量转成 1080p、h264 编码、crf 23、加右下角水印 logo.png、输出文件名加 _1080p 后缀用 shell 脚本实现要能并行处理加快速度——这种需求它能直接给你能跑的脚本。6.4 一个真实的协作片段我最近做的一个项目需要把一批竖屏视频转成横屏两边补模糊背景。我描述需求后它给的方案是ffmpeg -i input.mp4 -filter_complex \ [0:v]scale1920:1080:force_original_aspect_ratioincrease,crop1920:1080,boxblur20:5[bg]; \ [0:v]scale1080:-1[fg]; \ [bg][fg]overlay(W-w)/2:(H-h)/2 \ -c:a copy output.mp4思路是先把原视频放大裁剪成 1920x1080 当背景、加模糊再把原视频缩放到高度 1080 当前景、居中叠加。这个方案我微调了一下模糊强度就用了省了我至少半小时查文档的时间。但要注意AI 给的命令一定要自己验证。它偶尔会用错参数名或者对某些滤镜的行为理解有偏差。我的习惯是先用一个短片段测试确认效果对了再批量跑。7. 踩坑实录那些文档里不会写的经验7.1 编码参数选错导出慢十倍我早期做批量转码用了默认参数30 个视频跑了一晚上。后来发现-preset默认是medium改成veryfast后速度提升好几倍画质损失在可接受范围内。preset 从 slow 到 ultrafast速度差能有 5-10 倍而画质差异在多数场景下肉眼难辨。除非做存档否则别用 slow 系列。7.2 关键帧对齐问题导致拼接处花屏用-c copy拼接视频时如果各片段的编码参数不一致分辨率、帧率、编码器、甚至 GOP 结构拼接处会花屏或音画不同步。解决办法是先统一转码再拼接虽然慢但稳。或者用 concat 滤镜而不是 concat 协议前者会重新编码兼容性更好。7.3 中文字幕乱码ffmpeg 加字幕时如果字幕文件是 UTF-8 但没指定编码中文会乱码。加-sub_charenc UTF-8参数或者用subtitles滤镜时指定:charencUTF-8。这个坑我踩过不止一次因为报错信息完全不提示编码问题只是显示乱码。7.4 Remotion 渲染内存溢出渲染长视频时Remotion 可能因为帧缓存占满内存而崩溃。解决办法是降低--concurrency并发渲染数或者分段渲染再拼接。我一般把并发设成 CPU 核心数的一半稳很多。7.5 Manim 的 LaTeX 依赖地狱Manim 渲染数学公式需要 LaTeX 环境而 LaTeX 的安装和配置是出了名的麻烦。如果你只是画几何图形完全可以在配置里关掉 LaTeX 相关功能。真需要公式的话建议用完整的 TeX 发行版而不是最小安装能少很多缺包的报错。8. 给不同起点的人的三条上手路径8.1 完全新手从 ffmpeg 单条命令开始别一上来就搞 Remotion 和 Manim。先装好 ffmpeg用几条基础命令处理手头的视频——转格式、裁剪、压缩。感受一下命令行处理视频是什么体验。这一步大概花一两个小时能建立最基本的信心。8.2 有编程基础直接上 Remotion 做一个小项目如果你会 JavaScript/React直接开一个 Remotion 项目做一个最简单的标题 数字滚动视频。跑通渲染流程后你会对代码生成视频有直观理解。然后再回头补 ffmpeg 的知识因为 Remotion 底层也用 ffmpeg。8.3 做教学/科普内容Manim 值得投入如果你的内容涉及数学、算法、物理Manim 的投入产出比很高。它的动画质量是剪辑软件很难达到的而且一旦写好模板后续每期视频改数据就行。学习曲线陡但过了那个坎就是降维打击。三条路径没有优劣关键是匹配你当前的需求和基础。我见过太多人一上来就追求全套自动化流水线结果每个工具都浅尝辄止最后什么都没做成。先把一个工具用透再考虑组合。9. 关于工具选型我个人的一点体会折腾了这么久我最大的体会是视频自动化的难点从来不在工具本身而在于想清楚哪些环节值得自动化。ffmpeg、Remotion、Manim、Claude Code 都是好工具但它们解决的是怎么做的问题而做什么、为什么做永远得你自己想。我现在的习惯是每接一个视频相关的需求先问自己三个问题这个需求会重复多少次重复的部分能不能抽象成规则规则的维护成本比手工做低吗三个问题都是是才值得上代码化方案。否则老老实实用剪辑软件把省下来的时间花在内容本身上才是更聪明的选择。工具是为人服务的别反过来被工具绑架。这一点比任何一条 ffmpeg 命令都重要。
返回列表