容器、编码与流
本教程共 32 篇 · 第 6 篇 · 更新于 2026-08-09 · 约 6 分钟阅读
本节目标:彻底分清「容器、编码、流」这三个最容易混的词,以后看 ffprobe 输出不再懵。
学 FFmpeg 最容易卡住的地方,不是命令长,而是一堆名词混在一起。MP4、H.264、AAC、MKV、视频流、音频流——它们到底谁是谁?这一章把它们彻底理顺。
打个比方:快递包裹
把一个视频文件想象成一个快递箱。
- 容器(container) 是箱子,决定里面的东西怎么摆、怎么索引、箱子外面贴什么标签。常见的有 MP4、MKV、AVI、WebM、TS、MOV。
- 流(stream) 是箱子里的具体物品。一般有一条视频流、一条或多条音频流,可能还有字幕流。
- 编码格式(codec) 是物品的压缩方式。视频流用 H.264 或 HEVC 压缩,音频流用 AAC 或 MP3 压缩。
- 编码器(encoder) 是实现某种压缩方式的工具。比如 libx264 这个编码器负责产出 H.264 格式的数据。
一个箱子(容器)里可以装多种物品(流),每种物品用不同的打包方式(编码格式)压缩。箱子上贴的快递单就是元数据:标题、时长、分辨率、音轨语言等。
容器:不只是后缀名
容器负责把多条流捆在一起,并记录它们的时间戳、索引、元信息,让播放器知道「第 10 秒该显示哪帧画面、播哪段声音」。
常见容器:
| 容器 | 常见后缀 | 特点 |
|---|---|---|
| MP4 | .mp4、.m4v、.m4a | 兼容性最好,网页、手机、电视通吃 |
| MKV | .mkv | 万能容器,能装几乎所有编码,支持多音轨多字幕 |
| WebM | .webm | Google 推出,主要用于网页,常用 VP9/AV1 + Opus |
| AVI | .avi | 老格式,缺陷较多,现在不推荐 |
| TS | .ts、.m2ts | 广播和直播常用,适合切片传输 |
| MOV | .mov | QuickTime 用,苹果生态常见 |
| FLV | .flv | 早年直播常用,正逐渐被淘汰 |
Important后缀名不等于编码。 一个
.mp4文件里面的视频可能是 H.264,也可能是 HEVC、AV1,甚至 MPEG-4 Part 2。一个.mkv几乎能装任何编码。判断文件里面到底是什么,唯一靠谱的方法是ffprobe,而不是看后缀。
下面这条命令能查看 FFmpeg 支持的所有容器:
ffmpeg -formats
带 D 的表示可以解封装(读),带 E 的表示可以封装(写),DE 表示都行。
流:箱子里的物品
一个媒体文件里通常有一条或多条流:
- 视频流(video stream):一帧帧压缩后的图像。
- 音频流(audio stream):一段段压缩后的声音采样。
- 字幕流(subtitle stream):文字字幕或图形字幕。
- 数据流(data stream):附件、字体、章节信息等附加内容。
一个文件可以有多条同类流。比如电影文件常有:
- 1 条视频流;
- 3 条音频流(普通话、英语、日语);
- 5 条字幕流(简中、繁中、英文、日文等)。
在 ffprobe 的输出里,每条流都有编号,比如 Stream #0:0 是第一条流,Stream #0:1 是第二条。后面讲 -map 时,你需要用这些编号来指定「要哪条流」。
编码格式:压缩的规范
原始未压缩的视频体积是恐怖的。一个 1080p、24fps、30 分钟、每像素 3 字节的原始视频:
1920 × 1080 × 3 × 24 × 1800 ≈ 254 GB
所以必须压缩。编码格式(codec)就是压缩与解压的规范,它决定了用什么算法把原始帧压缩成更小的数据,以及怎么还原。
常见视频编码
| 编码 | 别名 | 推出年份 | 特点 |
|---|---|---|---|
| H.264 | AVC | 2003 | 兼容性最好,当前主流,编码器 libx264 |
| H.265 | HEVC | 2013 | 比 H.264 小约 40-50%,但有专利费,编码器 libx265 |
| VP8 | — | 2008 | Google 推出,WebRTC 用得多 |
| VP9 | — | 2013 | VP8 继任,YouTube 大量使用,免版税 |
| AV1 | — | 2018 | 最新免版税编码,压缩率高,编码较慢,编码器 libsvtav1 / libaom-av1 |
| MPEG-4 | XviD/DivX | 1999 | 老格式,AVI 时代常见 |
常见音频编码
| 编码 | 特点 | 编码器 |
|---|---|---|
| AAC | MP3 的继任者,视频里最常用 | aac(内置)、libfdk_aac |
| MP3 | 老牌有损格式,兼容性极强 | libmp3lame |
| Opus | 现代低延迟有损格式,WebRTC/直播用 | libopus |
| Vorbis | Ogg/WebM 里常见 | libvorbis |
| FLAC | 无损压缩,体积较大 | flac |
| PCM | 无压缩,WAV 文件里常见 | pcm_s16le 等 |
| AC3/E-AC3 | 杜比数字格式,DVD/蓝光常见 | ac3、eac3 |
查看支持的编码
ffmpeg -codecs # 所有编解码能力
ffmpeg -encoders # 只看编码器
ffmpeg -decoders # 只看解码器
注意区分「编码格式」和「编码器」:H.264 是格式,libx264 是具体的实现;HEVC 是格式,libx265 是实现。命令里 -c:v 后面填的是编码器名字,不是格式名字。
它们怎么配合工作
一次转码的完整流程是这样的:
输入文件 (MKV 容器)
│ 解封装(libavformat)
▼
视频流(HEVC) + 音频流(FLAC) + 字幕流(ASS)
│ 解码(libavcodec)
▼
原始帧 + 原始采样
│ 编码为新格式(比如 H.264 + AAC)
▼
新视频流(H.264) + 新音频流(AAC)
│ 封装进新容器(比如 MP4)
▼
输出文件 (MP4 容器)
不同容器能装的编码有限制。比如:
- MP4 最稳妥的组合是 H.264/HEVC + AAC。
- MKV 几乎什么都能装。
- WebM 通常用 VP8/VP9/AV1 + Vorbis/Opus。
选错组合 ffmpeg 会报错,或者能生成文件但播放器打不开。
一个实战判断
拿到一个文件,跑:
ffprobe -hide_banner input.mkv
看到类似:
Input #0, matroska,webm, from 'input.mkv':
Stream #0:0: Video: hevc, yuv420p, 1920x1080, 60 fps
Stream #0:1: Audio: flac, 48000 Hz, stereo
Stream #0:2: Subtitle: ass
你立刻能判断:
- 容器是 Matroska(MKV)。
- 视频是 HEVC,1080p 60fps。
- 音频是 FLAC。
- 字幕是 ASS。
如果要转成网页能直接播的 MP4,你知道要把视频转成 H.264、音频转成 AAC,再封装进 MP4。而不是只把文件后缀改成 .mp4——那样只是改了快递箱上的标签,里面物品没变,播放器照样可能打不开。
小结
- 容器是外壳(MP4、MKV、WebM),管打包和索引。
- 流是壳里的物品(视频、音频、字幕)。
- 编码格式是压缩规范(H.264、AAC、HEVC)。
- 编码器是实现规范的工具(libx264、aac)。
- 后缀名看不出编码,用 ffprobe 才靠谱。
下一章我们继续拆解视频和音频本身的关键参数:分辨率、帧率、码率和色度采样。