首页 / FFmpeg 入门教程 / 容器、编码与流

FFmpeg 入门教程

容器、编码与流

本教程共 32 篇 · 第 6 篇 · 更新于 2026-08-09 · 约 6 分钟阅读

FFmpeg容器编码器MP4MKVH.264AAC

本节目标:彻底分清「容器、编码、流」这三个最容易混的词,以后看 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.webmGoogle 推出,主要用于网页,常用 VP9/AV1 + Opus
AVI.avi老格式,缺陷较多,现在不推荐
TS.ts.m2ts广播和直播常用,适合切片传输
MOV.movQuickTime 用,苹果生态常见
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.264AVC2003兼容性最好,当前主流,编码器 libx264
H.265HEVC2013比 H.264 小约 40-50%,但有专利费,编码器 libx265
VP82008Google 推出,WebRTC 用得多
VP92013VP8 继任,YouTube 大量使用,免版税
AV12018最新免版税编码,压缩率高,编码较慢,编码器 libsvtav1 / libaom-av1
MPEG-4XviD/DivX1999老格式,AVI 时代常见

常见音频编码

编码特点编码器
AACMP3 的继任者,视频里最常用aac(内置)、libfdk_aac
MP3老牌有损格式,兼容性极强libmp3lame
Opus现代低延迟有损格式,WebRTC/直播用libopus
VorbisOgg/WebM 里常见libvorbis
FLAC无损压缩,体积较大flac
PCM无压缩,WAV 文件里常见pcm_s16le
AC3/E-AC3杜比数字格式,DVD/蓝光常见ac3eac3

查看支持的编码

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 才靠谱。

下一章我们继续拆解视频和音频本身的关键参数:分辨率、帧率、码率和色度采样。