FFmpeg 核心概念:编解码器、容器格式、转码流程、滤镜链、常用命令行参数
各位同学,欢迎来到第二章。这一章我们直接切入 FFmpeg 的骨架——那些你每天都会打交道的核心概念。说实话,很多初学者一开始就被 FFmpeg 那几百个参数吓住了,但其实你只要搞懂五样东西:编解码器、容器、转码流程、滤镜链、还有常用参数,剩下的都是查手册的事。
我在项目里见过不少同事,拿着 FFmpeg 当黑盒用,参数拼错了都不知道错在哪。嗯,咱们今天就把这个黑盒拆开,看看里面到底怎么转的。
2.1 编解码器(Codec)—— 灵魂所在
编解码器,说白了就是压缩和解压缩的算法。视频原始数据有多大?你想想看,一帧 1080p 的 RGB 图像大约 6MB,30fps 就是一秒 180MB。不压缩的话,一部电影能塞满你的硬盘。
FFmpeg 里常见的视频编解码器有这些:
| 编码器名称 | FFmpeg 名称 | 特点 | 我的使用场景 |
|---|---|---|---|
| H.264 / AVC | libx264 | 兼容性最好,码率控制成熟 | 日常转码、直播推流首选 |
| H.265 / HEVC | libx265 | 压缩率比 H.264 高 30-50% | 4K 视频存档、带宽受限场景 |
| VP9 | libvpx-vp9 | 开源、免专利费,但编码慢 | Web 端分发、YouTube 风格 |
| AV1 | libaom-av1 | 最新开源标准,压缩率极高 | 长期存档、下一代流媒体 |
| MPEG-4 | mpeg4 | 老标准,兼容旧设备 | 嵌入式设备、老旧播放器 |
音频编解码器也一样,常见的有:
- AAC(aac / libfdk_aac)—— 流媒体标配,音质好
- MP3(libmp3lame)—— 兼容性王者,但效率不如 AAC
- Opus(libopus)—— 开源新秀,低延迟高音质
- PCM(pcm_s16le)—— 无损,但体积巨大
为什么会用这么多编码器?因为每个场景的取舍不一样。直播要低延迟,存档要高压缩,Web 要兼容性——没有银弹。
2.2 容器格式(Container)—— 打包的艺术
编解码器压缩的是内容,容器格式管的是怎么把这些内容打包在一起。你想想看,一个视频文件里除了视频流,还有音频流、字幕、元数据(封面、章节信息)。容器就是那个盒子。
FFmpeg 里常见的容器格式:
| 容器 | 扩展名 | 支持特性 | 我踩过的坑 |
|---|---|---|---|
| MP4 | .mp4 | 最通用,支持 H.264/H.265 + AAC | 不支持 FLAC 音频,封装时会报错 |
| MKV | .mkv | 几乎什么都能装,字幕、多音轨 | 某些播放器兼容性差 |
| TS | .ts | 适合直播、流媒体切片 | 元数据支持弱 |
| FLV | .flv | Flash 时代产物,现在用于 RTMP | 不支持 H.265 |
| WebM | .webm | VP8/VP9 + Opus,Web 原生 | 编码器选择受限 |
-f flv 强制封装,它可能生成一个坏文件。记住:MP4 配 H.264+AAC,WebM 配 VP9+Opus,MKV 随便装。
2.3 转码流程 —— 一条管道通到底
FFmpeg 的转码流程,说白了就是一条管道:
输入 → 解封装 → 解码 → 滤镜处理 → 编码 → 封装 → 输出
我画了一张图,帮你把这条管道看清楚:
这条管道里,每一步都可以选择「做」或「不做」。比如你只想换容器格式,不重新编码,那就用 -c copy 跳过解码和编码环节。我经常用这个命令快速封装:
ffmpeg -i input.mkv -c copy output.mp4
这条命令只改变容器,不改变音视频编码。速度极快,而且画质无损。但要注意——如果源文件的编码格式目标容器不支持,FFmpeg 会报错。比如 MKV 里的 FLAC 音频,直接封装进 MP4 就会失败。
2.4 滤镜链(Filter Graph)—— 真正的魔法
滤镜链是 FFmpeg 最强大的部分,也是初学者最容易搞混的地方。说白了,滤镜就是对原始音视频帧做各种处理:缩放、裁剪、加水印、调色、变速、去噪……
FFmpeg 的滤镜链用 -vf(视频滤镜)和 -af(音频滤镜)参数指定。多个滤镜用逗号 , 串联,形成链式处理:
ffmpeg -i input.mp4 -vf "scale=1280:720, crop=1200:600:40:60" output.mp4
这条命令先缩放到 1280x720,然后从坐标 (40,60) 开始裁剪出 1200x600 的区域。滤镜从左到右依次执行。
如果你需要分路处理(比如画中画),就用方括号 [] 标记流,然后用分号 ; 连接多个滤镜图:
ffmpeg -i main.mp4 -i overlay.mp4 \
-filter_complex "[0:v]scale=1280:720[main]; \
[1:v]scale=320:240[overlay]; \
[main][overlay]overlay=10:10" \
output.mp4
-filter_complex 配合 -map 参数,把每一步的中间结果输出到不同的流,调试清楚了再合并。我曾经因为少写一个方括号,排查了整整两个小时。
常用的视频滤镜:
scale— 缩放分辨率crop— 裁剪画面drawtext— 添加文字水印fps— 改变帧率hflip/vflip— 水平/垂直翻转transpose— 旋转画面fade— 淡入淡出效果
音频滤镜也类似:
volume— 调整音量atempo— 改变播放速度(不改变音调)aresample— 重采样(改变采样率)adelay— 音频延迟
2.5 常用命令行参数 —— 实战工具箱
好了,理论说完了,咱们直接上命令。这些是我每天都会用到的参数,你记下来,工作中绝对用得上。
| 参数 | 作用 | 示例 |
|---|---|---|
-i |
指定输入文件 | -i input.mp4 |
-c:v |
指定视频编码器 | -c:v libx264 |
-c:a |
指定音频编码器 | -c:a aac |
-c copy |
流复制(不重新编码) | -c copy |
-b:v |
视频码率 | -b:v 2M |
-b:a |
音频码率 | -b:a 128k |
-r |
输出帧率 | -r 30 |
-s |
输出分辨率 | -s 1920x1080 |
-t |
处理时长 | -t 00:01:30 |
-ss |
起始时间 | -ss 00:05:00 |
-vf |
视频滤镜链 | -vf "scale=1280:720" |
-af |
音频滤镜链 | -af "volume=0.5" |
-map |
选择特定流 | -map 0:v:0 -map 1:a:0 |
-y |
覆盖输出文件 | -y output.mp4 |
-t 10 只处理前 10 秒,确认效果后再跑全片。另外,-ss 放在 -i 之前是「快速跳转」,放在之后是「精确跳转但解码慢」。我习惯放前面,速度快很多。
几个实战组合拳:
# 1. 转码为 H.264 + AAC,码率 2M
ffmpeg -i input.mkv -c:v libx264 -b:v 2M -c:a aac -b:a 128k output.mp4
# 2. 截取片段(从 5 分钟开始,持续 30 秒)
ffmpeg -ss 00:05:00 -i input.mp4 -t 30 -c copy output.mp4
# 3. 缩放 + 加水印
ffmpeg -i input.mp4 -vf "scale=1280:720, drawtext=text='Hello':x=10:y=10:fontsize=24:fontcolor=white" output.mp4
# 4. 提取音频
ffmpeg -i input.mp4 -vn -c:a libmp3lame output.mp3
# 5. 查看文件信息(不转码)
ffmpeg -i input.mp4
最后一条命令 ffmpeg -i input.mp4 不加输出文件,FFmpeg 会打印出文件的详细信息:编码格式、分辨率、码率、时长、元数据等等。这是我最常用的调试命令,没有之一。
-ss 放在 -i 后面,结果处理一个 2 小时的视频,每次都要从头解码到目标时间点,耗时极长。后来改成 -ss 00:05:00 -i input.mp4,速度提升了 10 倍。记住:-ss 放前面是「关键帧跳转」,放后面是「逐帧解码」。
好了,这一章的核心概念就这些。编解码器管压缩,容器管打包,转码流程管管道,滤镜链管处理,参数管控制。你把这五样东西搞清楚了,FFmpeg 对你来说就不再是黑盒了。