FFmpeg · 收尾导出:编解码器选对,成片才出得来

前言

前面四环做完,素材、剪辑、字幕都在手上了,最后导出这一步一糊,片子就交不出去:画面出现马赛克、音画不同步、响度不达标被平台打回,或者文件体积超出交付限制。这类问题几乎都不是 FFmpeg 不好用,而是参数没写对——-ss 放在 -i 前面还是后面,结果差很多;忘了加 -c copy,明明不需要重新编码却把整条片重压一遍,既慢又有损;-crf 和 -b:v 同时写,参数互相打架。

下面介绍的这个 Skill,就是把 FFmpeg 的编解码器选择、滤镜链、编码参数和常见错误,按一条可执行的顺序整理成速查。

这是什么

一句话定位:面向 Agent 的 FFmpeg 命令与参数指南,覆盖从输入定位到最终导出的完整链路。

  • 出品与维护:ivangdavila,ClawHub 账号 @ivangdavila。
  • 上游仓库:https://clawhub.ai/ivangdavila/ffmpeg
  • 版本:v1.0.0,许可证 MIT-0,ClawHub 安全审计结果为 Pass。
  • SkillHub 坐标:@clawhub_ivangdavila/ffmpeg,分类 design-media,评分 100000、下载 2820 之外的资料值 20880、安装 1290,标签 requires_api_key=false(不需要 API key)。
  • 说明:线索里提到的评分 99440、下载 2820 未被抓取到的资料证实,正文取资料值;ClawHub 页面把该 Skill 归在 Creative 分类下,与 SkillHub 的 design-media 不一致,属平台分类口径差异。

解决的问题是:Agent 调用 FFmpeg 时,默认行为往往不符合交付要求(默认只取第一条视频流和第一条音频流、默认重新编码、输出扩展名并不决定编码格式)。Skill 的作用是把这些默认行为显式写出来,并给出正确的显式写法。

核心能力

SKILL.md 实际包含的能力分九块,按顺序是输入定位、流选择、编码质量、容器与编解码、滤镜语法、常用滤镜、音频处理、拼接、字幕,外加硬件加速与常见错误。下面只列有资料支撑的内容。

输入定位:-ss 放在 -i 之前是快速定位,可能不准,从最近的关键帧开始;放在 -i 之后是逐帧精确但慢,需要从头解码。两者可以组合:先快速定位到大位置,再精确裁剪小段。

流选择:不指定时默认取第一条视频加第一条音频,这通常不是你要的。显式写法是 -map 0:v:0 -map 0:a:1(第一条视频、第二条音频)、-map 0:a(某类型全部流)、-map 0 -c copy(全部流且不重编码)、-map 0 -map -0:s(排除字幕)。

编码质量:CRF(Constant Rate Factor)值越低画质越高文件越大,H.264 常用区间 18-23;-preset 从 ultrafast 到 veryslow,越慢同画质下文件越小;两遍编码用于精确码率;-crf 与 -b:v 互斥,只能二选一。

容器与编解码:容器(MP4、MKV、WebM)是装流的壳,编解码(H.264、VP9、AAC)是流的压缩算法,两者不是一一对应——H.264 可以进 MP4 和 MKV,不能进 WebM;VP9 可以进 WebM 和 MKV,不能进 MP4。纯换容器不改编码时用 -c copy,快且无质量损失。

滤镜语法:简单链用 -vf,需要命名输出做路由时用 -filter_complex,多个滤镜用逗号串联,顺序会影响结果(先缩放再裁切和先裁切再缩放不是同一件事)。

常用滤镜:缩放 scale=1280:720 或 scale=-1:720(保持比例自动算宽)、裁切 crop=640:480:100:50(宽:高:x:y,从左上角起)、帧率 fps=30、截取 trim=start=10:end=20 配合 setpts=PTS-STARTPTS 重置时间戳、叠加 overlay=10:10。

音频处理:采样率 -ar 48000(视频标准)、声道 -ac 2(立体声)、编码 -c:a aac -b:a 192k、响度归一 -filter:a loudnorm(EBU R128)、抽音轨 -vn -c:a copy output.m4a。

拼接:参数一致用 concat demuxer,-f concat -safe 0 -i list.txt -c copy,list.txt 每行一个 file 'video1.mp4',特殊字符要转义;格式不同用 concat filter,-filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1";分辨率不同时要先 scale/pad 到一致再拼。

字幕:烧录进画面用 -vf "subtitles=subs.srt",观众无法关闭;作为独立流封装用 -c:s mov_text(MP4)或 -c:s srt(MKV);从输入取字幕流用 -map 0:s;单独导出第一条字幕用 -map 0:s:0 subs.srt。

硬件加速:解码用 -hwaccel cuda 或 -hwaccel videotoolbox(macOS),编码用 -c:v h264_nvenc(NVIDIA)或 -c:v h264_videotoolbox(macOS)。资料明确写了两点限制:不一定更快,长视频才看得出收益;画质可能有差异,软件编码通常更好。

安装与启用

官方页面给出的安装命令如下,作用是把该 Skill 装进 OpenClaw 的 skills 目录。

openclaw skills install @ivangdavila/ffmpeg

同页提供 CLI(npx skills)与 Prompt 两种入口,命令行安装与对话式调用两种方式都能用。

典型用法

下面几条都是 SKILL.md 里给出、可复现的写法。

1、快速定位加精确裁剪。先 -ss 00:30:00 -i input.mp4 跳到 30 分钟附近,再用第二个 -ss 00:00:05 精确裁掉前 5 秒。

ffmpeg -ss 00:30:00 -i input.mp4 -ss 00:00:05 -avoid_negative_ts make_zero output.mp4

-avoid_negative_ts make_zero 的作用是修时间戳,切片段后音画错位常用它。

2、显式指定流,避免默认取错。

ffmpeg -i input.mp4 -map 0:v:0 -map 0:a:1 -c copy output.mp4

3、H.264 转码,CRF 20 配 slow preset。

ffmpeg -i input.mp4 -c:v libx264 -crf 20 -preset slow -c:a aac -b:a 192k output.mp4

视频用 CRF 定质量,音频用比特率定体积,两者互不冲突。

4、EBU R128 响度归一,视频流不重编码。

ffmpeg -i input.mp4 -filter:a loudnorm -c:v copy output.mp4

5、同参数片段拼接,不重编码。

ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4

常见坑

这一节直接来自 SKILL.md 的 Common Mistakes,都是实际会踩的。

  • 该用 -c copy 的时候忘了加,FFmpeg 会默认重新编码,慢而且有损。
  • 长视频上把 -ss 放在 -i 之后,定位耗时极长。
  • 切片段后音频不同步,加 -async 1 或 -af aresample=async=1。
  • 想加滤镜又加了 -c copy,滤镜必须重编码,两者组合会直接报错。
  • 以为输出扩展名决定编码格式,output.mp4 不加 -c:v 时用的是默认编码,未必是 H.264。

适用场景与限制

适合做交付前的收尾:统一响度、统一编码与封装、拼片段、烧字幕、按平台要求转码。也适合作为 Agent 生成 FFmpeg 命令时的参数校验清单——把默认行为和常见错误写在 Skill 里,Agent 就不会凭记忆拼参数。

限制方面:资料中没有提到删静音(silenceremove)、平台响度标准表或具体报错码对照,这些不要按这个 Skill 能覆盖来期待,需要自己另外查。硬件加速的画质差异也没有量化数据,上线前建议对同一段素材做软件编码与硬件编码的对比。

结尾

这个 Skill 的价值不在于多新,而在于把 FFmpeg 最容易出错的几处(-ss 位置、-map 流选择、-c copy、CRF 与 -b:v 互斥、滤镜顺序)固化成了固定写法。前面几环做得再细,导出这一步参数写错就全白费,有个可查的清单会省掉大量试错。

官方地址:https://clawhub.ai/ivangdavila/ffmpeg
SkillHub:https://www.skillhub.cn/skills/clawhub_ivangdavila/ffmpeg

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye