1. 从“video-use”这个标题说起:它到底想解决什么问题
第一次看到“video-use”这个标题,我脑子里蹦出来的不是某个具体工具,而是一类非常典型的需求:用代码把视频处理这件事自动化起来。你手上有一堆素材,可能是录屏、可能是口播、可能是产品演示,你想把它们剪成一条能直接发出去的成片,但你又不想打开任何图形界面的剪辑软件,因为一旦素材量上去,手动拖时间线就是纯体力活。
“video-use”这个词本身很朴素,直译就是“视频使用”或者“视频的用法”。但结合热搜词里那一串东西——Claude Code、ffmpeg、ElevenLabs、Remotion——它的真实含义就清晰了:这是一套以命令行和代码为核心的视频生产工作流。ffmpeg 负责底层的解码、编码、裁剪、拼接、推流;Remotion 负责用 React 组件的方式“写”出视频画面;ElevenLabs 负责把文字变成配音;Claude Code 则是那个坐在中间、帮你把这一整套流程串起来、写脚本、调参数、排错误的“AI 搭子”。
我为什么这么判断?因为这几个词放在一起,指向的是一个非常具体的场景:一个人,一台机器,不依赖剪辑软件,靠脚本批量产出视频。这个场景在过去两年里变得越来越现实,原因也很简单——ffmpeg 足够稳,Remotion 把“视频即代码”这件事做得足够优雅,而 Claude Code 这类工具把写脚本的门槛压到了几乎为零。你不需要背 ffmpeg 那几百个参数,你只需要把需求描述清楚,让它帮你生成命令,然后你负责验证和微调。
这篇文章适合谁看?三类人。第一类是做内容但不想被剪辑软件绑住的人,比如做知识口播、做产品演示、做数据可视化视频的;第二类是有一定开发基础、想把视频处理接进自己系统里的工程师,比如要给用户批量生成个性化视频;第三类是纯粹对“用代码做视频”这件事好奇、想找个完整案例上手的人。不管你是哪一类,下面这套东西你都能直接抄作业,或者至少抄个七八成。
我先把结论放前面:video-use 的核心不是某一个工具,而是一条流水线。素材进来,经过转码、切分、合成、配音、字幕、导出,最后出去一个成片。每个环节都有成熟的工具,难点在于把它们串起来,并且让每一步都可复现、可调试。下面我就按这条流水线的顺序,把每个环节拆开讲。
2. 整体设计思路:为什么是 ffmpeg + Remotion + ElevenLabs + Claude Code
2.1 为什么底层一定要用 ffmpeg
视频处理这个领域,ffmpeg 基本是绕不过去的。你可以把它理解成视频世界的“瑞士军刀”,但它更像是一个没有界面的发动机。所有剪辑软件、转码工具、直播推流工具,底层大概率都在调它。它的能力覆盖了解码、编码、滤镜、裁剪、拼接、变速、加字幕、推流、拉流,几乎你能想到的视频操作它都能做。
我选择 ffmpeg 作为底层的理由很直接:它是确定性的。同样的输入、同样的参数,出来的结果就是一样的。这对自动化流程来说太重要了。你用图形软件剪,今天手抖拖错一帧,明天可能就复现不出来;但 ffmpeg 的命令写在那里,跑一百遍结果都一样。而且它跨平台,Windows、macOS、Linux 上行为基本一致,这对“写一次脚本到处跑”很关键。
当然 ffmpeg 的坑也不少。最典型的就是参数顺序问题——同样是-ss,放在-i前面和后面,行为完全不同。放前面是快速定位(关键帧级别),放后面是精确到帧但速度慢。这个细节后面我会专门讲。还有编码器选择,libx264和h264_nvenc出来的质量和速度差异很大,选错了要么慢得离谱,要么画质糊得没法看。
2.2 Remotion 补上了“画面从哪来”这一环
ffmpeg 很强,但它有个短板:它不擅长“从零生成画面”。你可以用它拼接已有素材,可以用滤镜做转场,但如果你想画一个动态的数据图表、做一个带品牌色的标题卡、生成一段文字逐字出现的动画,用 ffmpeg 的滤镜去硬拼会非常痛苦。
Remotion 解决的正是这个问题。它让你用 React 组件来定义视频的每一帧。你写一个组件,接收一个frame参数,返回这一帧应该长什么样。Remotion 会把这个组件在时间轴上逐帧渲染,最后交给 ffmpeg 编码成视频。这意味着什么?意味着你可以用写网页的方式写视频。CSS 动画、SVG、Canvas、甚至引入第三方图表库,全都能用。
我实测下来,Remotion 最适合做三类东西:数据可视化视频、带动态文字的标题卡、以及需要精确控制每一帧的合成画面。它的学习曲线对前端来说几乎为零,对非前端来说也不算陡,因为核心概念就一个:帧驱动。你只要理解“第 n 帧长什么样”,剩下的就是 React 的常规写法。
2.3 ElevenLabs 负责把文字变成人声
口播视频最耗时的环节是什么?不是剪,是录。录一遍不满意,重录;改一句文案,重录。ElevenLabs 这类文字转语音工具的价值就在于,它把“录音”变成了“生成”。你把文案丢进去,选一个音色,出来的就是一段可以直接用的音频。
我为什么在标题相关的热词里看到 ElevenLabs?因为它和 ffmpeg、Remotion 是天然搭配。Remotion 生成画面,ElevenLabs 生成声音,ffmpeg 把两者合在一起,再加上字幕,一条完整的口播视频就出来了。整个过程不需要麦克风,不需要录音棚,甚至不需要你本人出声。
这里有个实操细节:ElevenLabs 生成的音频采样率通常是 44.1kHz 或 48kHz,而 ffmpeg 合成时如果音频和视频的采样率、声道数不一致,会出现音画不同步或者声音变调。所以合成前一定要用 ffmpeg 统一一下参数,这个后面会讲具体命令。
2.4 Claude Code 是那个“把一切串起来”的角色
前面三个工具各自都很强,但它们是分散的。ffmpeg 命令要手写,Remotion 项目要搭,ElevenLabs 要调 API。Claude Code 的价值在于,它能把“我想做一个什么样的视频”这个自然语言需求,翻译成具体的脚本和命令。
比如你说“把这段文案生成配音,配上逐字出现的字幕,背景用深色,最后导出 1080p 的 mp4”,Claude Code 可以帮你写出调用 ElevenLabs API 的脚本、生成 Remotion 的字幕组件、拼出 ffmpeg 的合成命令。你不需要记住每个工具的 API 细节,你只需要能判断它给的东西对不对。
但这里我要泼一盆冷水:Claude Code 不是万能的,它生成的命令必须验证。我踩过的坑包括它把-ss放错位置导致截取不准、把音频编码器写成aac但容器不支持、以及 Remotion 的帧率设置和 ffmpeg 的-r参数对不上导致视频变速。所以正确的用法是:让它生成初稿,你来跑,报错了把错误贴回去让它改,来回几轮才能稳定。
3. 核心细节解析:每个环节的关键参数与避坑点
3.1 ffmpeg 安装与版本选择
先说安装。Windows 上最省事的方式是去官网下ffmpeg-master-latest-win64-gpl.zip,解压后把bin目录加到系统环境变量 PATH 里。注意是gpl版本而不是essentials,因为essentials不带libx264之外的很多编码器,做视频合成时容易缺东西。macOS 上用brew install ffmpeg就行,Linux 上apt install ffmpeg或者自己编译。
版本选择上,我建议用近半年内的稳定版。太老的版本不支持一些新的滤镜和编码参数,太新的 master 版可能有未修复的 bug。判断版本用ffmpeg -version,看第一行的版本号和编译配置里有没有--enable-libx264、--enable-libfdk-aac这些关键项。
注意:Windows 上如果之前装过 ffmpeg 又重装了系统,PATH 里的旧路径会失效,表现为命令行里敲
ffmpeg提示找不到命令。这时候不是重装,而是重新把新解压目录的bin加进 PATH,然后重启终端。
3.2 ffmpeg 命令的核心参数逻辑
ffmpeg 的命令结构是ffmpeg [全局参数] [输入参数] -i 输入 [输出参数] 输出。理解这个结构,很多报错就迎刃而解了。
几个最容易出错的点:
-ss的位置:放在-i前是输入定位,速度快但不精确;放在-i后是输出定位,精确但慢。做精确剪辑时用后者。-c:v和-c:a:分别指定视频和音频编码器。合成时视频常用libx264,音频常用aac。-crf:恒定质量模式,范围 0-51,数值越小质量越高。18-23 是常用区间,18 接近视觉无损。-preset:编码速度预设,从ultrafast到veryslow。越快压缩率越低,文件越大。日常用medium平衡。-r:帧率。如果源是 30fps 而输出设成 25fps,视频会变速,必须配合-filter:v fps=25做帧率转换。
我见过太多人卡在“为什么我的视频导出后声音对不上画面”,九成是因为音频和视频的时长或帧率没对齐。解决办法是先分别处理音频和视频,确认各自时长一致,再用-shortest参数合成,让输出以较短的流为准。
3.3 Remotion 项目的搭建与渲染
Remotion 的安装很直接,用npx create-video@latest就能起一个项目。核心文件是src/Root.tsx和各个Composition。一个 Composition 定义了视频的宽高、帧率、时长,以及用哪个组件渲染。
渲染命令是npx remotion render <composition-id> out/video.mp4。这里有个关键点:Remotion 渲染出来的视频默认是无声的,它只负责画面。声音要靠 ffmpeg 后期合成,或者在 Remotion 里用<Audio>组件引入。我一般选择后期合成,因为这样音频处理更灵活。
Remotion 的性能是个绕不开的话题。它渲染时是逐帧截图再编码,所以对 CPU 和内存有一定要求。一个 1080p、30fps、60 秒的视频,大概要渲染 1800 帧。如果每帧的组件很复杂(比如有大量 DOM 节点或复杂计算),渲染时间会明显拉长。优化手段包括:减少不必要的重渲染、用useCurrentFrame而不是useState驱动动画、把静态部分抽成常量。
3.4 ElevenLabs 的调用与音频处理
ElevenLabs 提供 REST API,核心就是发一个 POST 请求,带上文本、音色 ID、模型 ID,返回音频二进制流。用 Python 写大概是这样:
import requests url = "https://api.elevenlabs.io/v1/text-to-speech/{voice_id}" headers = { "xi-api-key": "你的API_KEY", "Content-Type": "application/json" } data = { "text": "这里是你要转成语音的文案", "model_id": "eleven_multilingual_v2", "voice_settings": { "stability": 0.5, "similarity_boost": 0.75 } } response = requests.post(url, json=data, headers=headers) with open("voice.mp3", "wb") as f: f.write(response.content)拿到 mp3 后,不要直接丢给 ffmpeg 合成。先用 ffmpeg 转成 wav 并统一采样率:
ffmpeg -i voice.mp3 -ar 48000 -ac 2 -c:a pcm_s16le voice.wav-ar 48000是采样率,-ac 2是双声道,pcm_s16le是无损 PCM。这样处理后再和视频合成,基本不会出现音画不同步。
3.5 Claude Code 在流程中的实际用法
Claude Code 的安装方式取决于平台。macOS 和 Linux 上通常是通过 npm 全局安装,Windows 上可以用桌面版或者 WSL。安装完在项目目录里运行,它就能读取当前目录的文件,理解你的项目结构。
我实际用它的方式是这样的:先在项目根目录放一个README.md,写清楚我要做什么视频、素材在哪、输出规格是什么。然后让 Claude Code 读这个文件,生成 ffmpeg 命令或者 Remotion 组件。它给出的东西我会先跑一遍,报错就把错误信息贴回去,让它修正。
一个很实用的技巧是:让它把命令拆成小步。不要让它一次性生成一条巨长的 ffmpeg 命令,而是分成“转码”“裁剪”“合成音频”“加字幕”“导出”几步,每步单独验证。这样出错时定位快,也方便你理解每一步在干什么。
提示:Claude Code 生成的 ffmpeg 命令里,路径分隔符在 Windows 和 Unix 下不同。如果你在 Windows 上跑,记得把
/换成\或者用引号包住路径,否则容易报Invalid argument。
4. 完整实操流程:从素材到成片的每一步
4.1 环境准备与依赖安装
先把四个东西装齐:ffmpeg、Node.js(Remotion 需要)、Python(调 ElevenLabs API 用)、Claude Code。Node.js 建议 18 以上,Python 建议 3.9 以上。
验证安装:
ffmpeg -version node -v python --version三个都能输出版本号,环境就算齐了。然后建项目目录:
mkdir video-use && cd video-use mkdir assets output scriptsassets放原始素材,output放成品,scripts放生成的脚本。
4.2 素材预处理:统一格式与参数
原始素材的格式五花八门,有 mp4、mov、mkv,分辨率有 1080p、4K,帧率有 24、30、60。直接拼接会出问题,所以第一步是统一转码。
假设目标规格是 1920x1080、30fps、H.264:
ffmpeg -i assets/raw.mp4 \ -vf "scale=1920:1080:force_original_aspect_ratio=decrease,pad=1920:1080:(ow-iw)/2:(oh-ih)/2,fps=30" \ -c:v libx264 -crf 20 -preset medium \ -c:a aac -ar 48000 -ac 2 \ output/normalized.mp4这条命令做了几件事:scale缩放并保持比例,pad补黑边到精确的 1920x1080,fps=30统一帧率。force_original_aspect_ratio=decrease保证不拉伸变形,这是很多人忽略的点——直接scale=1920:1080会把 4:3 的素材拉成 16:9,人脸都变形。
4.3 用 Remotion 生成画面
在项目里初始化 Remotion:
npx create-video@latest remotion-project cd remotion-project然后写一个简单的标题卡组件。假设我们要做一个“文字逐字出现”的效果:
import { useCurrentFrame, useVideoConfig, AbsoluteFill } from 'remotion'; export const TitleCard = ({ text }: { text: string }) => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); const charsToShow = Math.floor((frame / fps) * 10); return ( <AbsoluteFill style={{ backgroundColor: '#0f0f0f', justifyContent: 'center', alignItems: 'center', color: '#ffffff', fontSize: 72, fontFamily: 'sans-serif' }}> {text.slice(0, charsToShow)} </AbsoluteFill> ); };这个组件每秒显示 10 个字符,frame / fps得到当前秒数,乘以 10 就是应该显示的字符数。简单直接,而且完全可预测。
在Root.tsx里注册这个 Composition,设置宽高 1920x1080、帧率 30、时长根据文案长度算。然后渲染:
npx remotion render TitleCard output/title.mp44.4 生成配音并合成
用前面的 Python 脚本调 ElevenLabs 拿到voice.mp3,转成 wav。然后计算视频和音频的时长:
ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 output/title.mp4 ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 voice.wav如果音频比视频长,要么裁音频,要么延长视频。我一般选择让视频适配音频,因为画面延长比声音裁剪自然。用-shortest合成:
ffmpeg -i output/title.mp4 -i voice.wav \ -c:v copy -c:a aac -b:a 192k \ -shortest output/final.mp4-c:v copy表示视频流直接复制不重新编码,速度快且无损。音频重新编码成 aac,码率 192k 足够。
4.5 加字幕与最终导出
字幕有两种做法:硬字幕(烧进画面)和软字幕(单独轨道)。硬字幕兼容性最好,任何播放器都能显示:
ffmpeg -i output/final.mp4 \ -vf "subtitles=subs.srt:force_style='FontSize=24,PrimaryColour=&HFFFFFF&'" \ -c:a copy output/final_sub.mp4subs.srt是标准字幕文件,格式是序号、时间轴、文本三行一组。force_style可以控制字体大小和颜色。注意PrimaryColour用的是&HAABBGGRR&格式,和常见的 RGB 顺序相反,这个坑我踩过。
最终导出时,如果目标是上传平台,建议用-movflags +faststart把元数据移到文件头,这样在线播放时能更快起播:
ffmpeg -i output/final_sub.mp4 -c copy -movflags +faststart output/publish.mp45. 常见问题与排查技巧实录
5.1 ffmpeg 报错速查表
| 报错信息 | 常见原因 | 解决办法 |
|---|---|---|
Invalid argument | 参数位置错误或路径含特殊字符 | 检查-ss位置,路径加引号 |
Unknown encoder 'libx264' | 安装的是 essentials 版 | 换 gpl 完整版 |
Audio and video not synchronized | 采样率或帧率不一致 | 统一-ar 48000和-r 30 |
No such filter: 'subtitles' | 编译时未启用 libass | 换带 libass 的版本 |
Output file is empty | 输入路径错误或权限不足 | 检查路径和写入权限 |
5.2 Remotion 渲染慢怎么办
Remotion 渲染慢通常有三个原因:组件太复杂、帧率太高、并发数太低。解决办法:把静态元素抽成常量避免重复计算;如果最终输出是 30fps,渲染时也用 30fps,不要用 60fps 再降;用--concurrency参数提高并发,一般设成 CPU 核心数。
还有一个隐藏坑:Remotion 默认会用系统的 Chrome 来渲染,如果 Chrome 版本太新或太旧,可能渲染失败。可以在配置里指定browserExecutable指向一个稳定版本的 Chromium。
5.3 音画不同步的排查思路
音画不同步是最常见也最烦人的问题。排查顺序是:先看源文件本身是否同步,再看转码后是否同步,最后看合成后是否同步。如果源文件就不同步,那是录制问题,后期很难修;如果转码后不同步,多半是帧率转换导致的,检查-r和fps滤镜;如果合成后不同步,检查音频采样率和视频帧率是否匹配。
我个人的经验是:所有音频统一转成 48kHz 双声道 PCM,所有视频统一转成 30fps H.264,然后再做任何合成操作。这个“统一预处理”步骤能避免九成以上的同步问题。
5.4 Claude Code 使用中的注意事项
Claude Code 生成的代码和命令,一定要在隔离环境里先跑。我一般会建一个临时目录,把生成的脚本放进去跑一遍,确认没问题再挪到正式项目里。另外,它有时候会“幻觉”出一些不存在的 API 参数,比如给 ffmpeg 加一个-quality参数(实际不存在),这时候跑一下就会报错,把错误贴回去它就能修正。
还有一点:Claude Code 对项目上下文的理解依赖你给的信息。如果你只丢一句“帮我做个视频”,它给的东西会很泛。但如果你把素材规格、目标平台、时长要求、风格偏好都写清楚,它给的方案会精准很多。这其实就是“提示词工程”在视频生产里的应用。
6. 我在这套流程里踩过的坑和总结的技巧
第一个坑是路径问题。Windows 上 ffmpeg 对中文路径和空格路径支持不好,经常报Invalid argument。我的做法是项目目录全用英文,路径里不出现空格,需要空格的地方用下划线代替。这个习惯帮我省了大量排查时间。
第二个坑是编码器选择。一开始我图快用了h264_nvenc(NVIDIA 硬件编码),结果发现同样的 CRF 值,硬件编码出来的画质明显不如libx264,而且在不同显卡上表现不一致。后来做需要精确控制质量的视频,我一律用libx264,只在批量转码、对画质要求不高的场景才用硬件编码。
第三个坑是Remotion 的帧率陷阱。Remotion 的 Composition 里设了 30fps,但 ffmpeg 合成时如果没指定-r 30,默认可能按 25fps 处理,导致视频变慢。解决办法是在所有 ffmpeg 命令里显式写-r 30,和 Remotion 保持一致。
第四个坑是ElevenLabs 的字符限制。单次请求的文本长度有限制,长文案要分段生成再拼接。拼接时注意段与段之间的静音间隔,太短会显得急促,太长会显得拖沓。我一般留 300ms 左右的间隔,用 ffmpeg 的concat滤镜拼接。
最后分享一个提高效率的小技巧:把整个流程写成一个 Makefile 或者 shell 脚本。每个环节一个 target,比如make normalize、make render、make voice、make compose。这样你改一个环节,只需要重跑那一个 target,不用从头来。配合 Claude Code,你可以让它帮你维护这个脚本,新增环节时自动补上对应的命令。
这套 video-use 的流程我跑了大概半年,从最初的手忙脚乱到现在基本能稳定产出,最大的感受是:视频生产的瓶颈从来不是工具,而是流程的确定性。ffmpeg 给你确定性,Remotion 给你确定性,ElevenLabs 给你确定性,Claude Code 帮你把确定性串起来。当每个环节都可复现、可调试,批量生产视频就从一个创意问题变成了一个工程问题。而工程问题,总是有解的。