4. 核心概念:容器格式、编码格式、流、封装与解封装、转码流程全景图

说实话,很多初学者一上来就被这些术语搞晕了。我当年也是。明明都是视频文件,为什么有的后缀是 .mp4,有的是 .mkv,还有 .avi?它们到底有什么区别?

嗯,这一章我们就来彻底搞清楚这些核心概念。搞懂了它们,你才算真正入了 FFmpeg 的门。

4.1 容器格式(Container Format)

容器格式,说白了就是一个“包装盒”。它本身不负责压缩视频,只负责把视频流、音频流、字幕、元数据这些东西打包在一起。

你可以把它想象成一个快递箱子。箱子里可以放衣服、书本、电子产品。箱子本身只是容器,里面的东西才是核心。

常见的容器格式:

  • MP4(.mp4):最通用的格式,几乎所有设备和平台都支持。我个人习惯用它做最终交付。
  • MKV(.mkv):功能最强大,支持多音轨、多字幕、章节信息。我经常用它做蓝光原盘的封装。
  • AVI(.avi):老古董了,兼容性差,体积大。除非你还在用 Windows 98,否则尽量别碰。
  • MOV(.mov):苹果家的格式,在 macOS 和 iOS 生态里表现很好。
  • FLV(.flv):曾经的流媒体王者,现在基本被 MP4 取代了。
容器格式 常见后缀 特点 适用场景
MP4 .mp4 兼容性最好,压缩率高 网络分发、移动设备
MKV .mkv 功能丰富,支持多轨 本地收藏、蓝光备份
AVI .avi 兼容性差,体积大 老旧设备、特殊需求
MOV .mov 苹果生态优化 macOS/iOS 开发
FLV .flv 流媒体支持好 直播、早期视频网站

4.2 编码格式(Codec)

编码格式才是真正干活的。它负责把原始的视频数据压缩成更小的体积,或者把压缩后的数据还原成画面。

为什么需要压缩?你想想看,一段 1080p 的原始视频,一秒钟就有将近 150MB 的数据量。不压缩的话,一部电影能塞满你的硬盘。

编码格式就是那个“魔术师”。它通过复杂的算法,去掉人眼不敏感的细节,把数据量压缩到原来的几十分之一甚至几百分之一。

常见的视频编码格式:

  • H.264(AVC):目前最主流的编码,兼容性极好。我在项目中 80% 的情况都用它。
  • H.265(HEVC):H.264 的升级版,同等画质下体积小一半。但编码速度慢,老设备不支持。
  • VP9:谷歌家的开源编码,YouTube 在用。压缩率不错,但编码速度是硬伤。
  • AV1:新一代开源编码,压缩率比 H.265 还高 30%。但编码速度慢到令人发指。

音频编码也一样,常见的像 AAC、MP3、Opus。AAC 是目前网络视频的标配,Opus 则在低码率下表现惊人。

4.3 流(Stream)

流,就是容器里的“内容实体”。一个视频文件里,通常包含多个流:

  • 视频流:画面数据
  • 音频流:声音数据
  • 字幕流:文字数据
  • 数据流:比如章节信息、封面图

我记得有一次处理一个 MKV 文件,里面居然有 5 条音轨、8 条字幕轨。用 FFmpeg 查看的时候,输出信息密密麻麻的。这时候你就得学会怎么精准地操作某一条流。

用 FFmpeg 查看流信息很简单:

ffmpeg -i input.mp4

输出里会显示类似这样的内容:

Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 5000 kb/s, 25 fps, 25 tbr, 12800 tbn, 50 tbc (default)
Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)

看到没?Stream #0:0 就是第一个输入文件的第 0 号流,#0:1 是第 1 号流。后面的信息告诉你:视频是 H.264 编码,分辨率 1920x1080,码率 5000 kb/s;音频是 AAC 编码,采样率 48000 Hz,立体声。

4.4 封装与解封装

这两个词听起来高大上,其实很简单:

  • 解封装(Demuxing):把容器拆开,取出里面的流。就像打开快递箱,拿出里面的东西。
  • 封装(Muxing):把多个流打包成一个容器。就像把东西放回快递箱,封好。

FFmpeg 里,解封装和封装是分开的步骤。你可以先解封装,处理流,再重新封装。也可以直接一步到位。

举个例子,我想把一个 MKV 文件里的视频流和音频流提取出来,重新封装成 MP4:

ffmpeg -i input.mkv -c copy output.mp4

这里 -c copy 的意思是“直接复制流,不重新编码”。这样速度极快,几秒钟就能搞定。我在项目里经常用这招来快速转换容器格式。

注意:不是所有容器都支持所有编码格式。比如 MP4 就不支持 VP9 编码。强行封装会报错。所以封装前一定要确认兼容性。

4.5 转码流程全景图

好了,现在我们把所有概念串起来。一个完整的转码流程是这样的:

  1. 输入文件:比如一个 MKV 文件
  2. 解封装:FFmpeg 打开容器,读取里面的流信息
  3. 解码:把压缩的视频/音频数据解压成原始数据
  4. 滤镜处理:对原始数据进行缩放、裁剪、调色等操作(可选)
  5. 编码:把原始数据重新压缩成目标编码格式
  6. 封装:把新的流打包成目标容器格式
  7. 输出文件:比如一个 MP4 文件

下面这张图可以帮你更直观地理解整个过程:

FFmpeg 转码流程全景图 输入文件 input.mkv 解封装 Demuxing 解码 Decoding 滤镜处理 Filters 编码 Encoding 封装 Muxing 输出文件 output.mp4 关键说明: 1. 如果只是转换容器格式(如 MKV → MP4),可以跳过解码和编码步骤, 使用 -c copy 直接复制流,速度极快。 2. 如果需要改变编码格式(如 H.264 → H.265),则必须经过解码和编码。 3. 滤镜处理是可选的,只有需要修改画面时才使用。 4. 我曾经遇到一个项目,客户要求把 1000 个视频从 AVI 转成 MP4, 直接用 -c copy 发现报错,就是因为 AVI 里的编码 MP4 不支持。

看到这张图,你应该对整个转码流程有了清晰的认识。其实 FFmpeg 的核心工作就是围绕这个流程展开的。你只需要告诉它:输入什么、怎么处理、输出什么,剩下的它帮你搞定。

我的经验:刚开始用 FFmpeg 的时候,别急着搞复杂的滤镜和参数。先学会用 -c copy 做容器转换,再慢慢尝试重新编码。一步一个脚印,稳得很。