ARTICLE DETAIL

资讯详情

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

video-use:用ffmpeg+Remotion+ElevenLabs+Claude Code实现视频自动化生产

video-use:用ffmpeg+Remotion+ElevenLabs+Claude Code实现视频自动化生产 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 Code2.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 fps25做帧率转换。我见过太多人卡在“为什么我的视频导出后声音对不上画面”九成是因为音频和视频的时长或帧率没对齐。解决办法是先分别处理音频和视频确认各自时长一致再用-shortest参数合成让输出以较短的流为准。3.3 Remotion 项目的搭建与渲染Remotion 的安装很直接用npx create-videolatest就能起一个项目。核心文件是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, jsondata, headersheaders) 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.jsRemotion 需要、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.264ffmpeg -i assets/raw.mp4 \ -vf scale1920:1080:force_original_aspect_ratiodecrease,pad1920:1080:(ow-iw)/2:(oh-ih)/2,fps30 \ -c:v libx264 -crf 20 -preset medium \ -c:a aac -ar 48000 -ac 2 \ output/normalized.mp4这条命令做了几件事scale缩放并保持比例pad补黑边到精确的 1920x1080fps30统一帧率。force_original_aspect_ratiodecrease保证不拉伸变形这是很多人忽略的点——直接scale1920:1080会把 4:3 的素材拉成 16:9人脸都变形。4.3 用 Remotion 生成画面在项目里初始化 Remotionnpx create-videolatest 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 formatduration -of defaultnoprint_wrappers1:nokey1 output/title.mp4 ffprobe -v error -show_entries formatduration -of defaultnoprint_wrappers1:nokey1 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 subtitlessubs.srt:force_styleFontSize24,PrimaryColourHFFFFFF \ -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 30No 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_nvencNVIDIA 硬件编码结果发现同样的 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 帮你把确定性串起来。当每个环节都可复现、可调试批量生产视频就从一个创意问题变成了一个工程问题。而工程问题总是有解的。
返回列表