封装格式基础:容器、编码与你的视频文件

做视频处理这么多年,我经常被问到同一个问题:「老师,MP4 和 MKV 到底哪个好?」每次听到这个,我就知道对方还没搞明白封装格式的本质。今天咱们就把这事儿彻底说清楚。

什么是封装格式?说白了就是个盒子

你想想看,一个视频文件里都有啥?有画面、有声音、可能还有字幕、章节信息。封装格式,就是把这些东西打包在一起的「盒子」。这个盒子规定了:

  • 数据怎么排列
  • 索引怎么建立
  • 播放器怎么找到画面和声音

我习惯把封装格式比作快递箱。视频编码是箱子里的商品,封装格式是箱子本身。箱子好不好,决定了你能不能方便地取出商品。

核心概念:封装格式 ≠ 视频编码。一个 MP4 文件,里面可以是 H.264 编码的视频,也可以是 H.265 编码的视频。封装格式只负责「装」,不负责「怎么压缩」。

常见封装格式对比

这些年我经手过的封装格式少说也有十几种,但真正常用的就这几个。咱们一个一个看。

格式 全称 典型场景 我的评价
MP4 MPEG-4 Part 14 网络播放、移动设备 兼容性之王,几乎万能
MKV Matroska 高清收藏、多轨封装 功能最全,但兼容性一般
AVI Audio Video Interleave 老旧设备、Windows 遗产 该退休了,真的
FLV Flash Video 直播、网页播放器 Flash 已死,但 FLV 还在用
TS MPEG Transport Stream 广播电视、直播流 抗丢包能力强,适合传输

MP4:行业老大哥

MP4 是我用得最多的格式,没有之一。它的优势就一个字:稳。几乎所有设备、所有播放器都支持 MP4。我在项目中遇到过最极端的情况——客户要求视频在 200 台不同型号的 Android 手机上都能播,我二话不说选了 MP4 + H.264,最后只有 3 台老古董出了问题。

小技巧:MP4 的 moov box(元数据)默认在文件末尾,导致网络播放需要先下载整个文件才能拖动。用 FFmpeg 加 -movflags +faststart 可以把 moov 移到文件头,实现边下边播。

MKV:功能最全的容器

MKV 是我个人收藏电影的首选。为什么?因为它几乎什么都能装:

  • 无限多的音轨(导演评论、不同语言)
  • 字幕直接内嵌(不用外挂 srt 文件)
  • 章节标记、封面图、附件
  • 支持任意编码格式

但 MKV 有个致命伤——浏览器原生不支持。你没法在网页上直接放 MKV,得靠 JavaScript 解码器。所以做在线视频的朋友,还是老老实实用 MP4 吧。

AVI:老古董该退休了

说实话,我现在看到 AVI 文件就头疼。这个格式是 1992 年的产物,有很多历史遗留问题:

  • 单个文件最大 2GB(老版本)
  • 不支持 B 帧(影响压缩效率)
  • 索引结构脆弱,文件损坏后很难修复

我曾经帮一个客户修复 500GB 的 AVI 监控录像,索引全坏了,折腾了三天才用 FFmpeg 重新映射出来。从那以后,我见到 AVI 就劝人转封装。

FLV:Flash 已死,FLV 犹存

你可能觉得 FLV 已经过时了。但你知道吗?国内很多直播平台还在用 FLV 做直播流。原因很简单:FLV 结构简单,可以边下载边播放,延迟低。配合 HTTP-FLV 协议,延迟能控制在 3-5 秒。

注意:FLV 不支持 H.265/HEVC 编码(除非魔改)。如果你要用 FLV 推流,视频编码只能选 H.264。

TS:广播电视的传家宝

TS 格式很有意思。它最初是为数字电视设计的,特点是:

  • 每个数据包只有 188 字节
  • 即使丢包,也不影响其他数据包
  • 支持多节目复用(一个 TS 流里可以同时传多个频道)

做直播的朋友应该熟悉 HLS 协议,它就是把视频切成一个个小的 TS 片段来传输的。我做过一个项目,要在海上石油平台上做视频直播,卫星链路丢包率高达 5%,最后就是用 TS 格式扛下来的。

容器与编码的关系

这是新手最容易搞混的地方。我画个图帮你理清楚:

容器与编码的关系 封装容器(Container) 视频轨道 H.264 / H.265 / VP9 (视频编码) 音频轨道 AAC / MP3 / AC-3 (音频编码) 字幕轨道 SRT / ASS / VTT (字幕格式) 元数据:时长、分辨率、码率、章节、封面 封装格式决定「怎么装」,编码格式决定「怎么压缩」

你看,一个封装容器里可以包含多个轨道。每个轨道都有自己的编码格式。这就是为什么你可以:

  • 把 H.264 视频 + AAC 音频装进 MP4
  • 把 H.265 视频 + FLAC 音频装进 MKV
  • 甚至把同一个视频用不同编码各存一份,放在同一个 MKV 里

关键点:转封装(改变容器格式)和转编码(改变视频编码)是完全不同的操作。转封装不损失画质,转编码会损失画质。我见过太多人把 MP4 转成 MKV 结果重新编码了一遍,白白损失了画质。

实际项目中的选择策略

说了这么多理论,咱们来点实际的。我一般这么选:

  1. 做在线视频网站 → MP4 + H.264 + AAC。兼容性最好,CDN 支持最成熟。
  2. 做蓝光原盘备份 → MKV + H.265 + FLAC。画质无损,体积小一半。
  3. 做直播推流 → FLV + H.264 + AAC。延迟低,结构简单。
  4. 做广播电视 → TS + H.264 + AAC。抗丢包,支持多节目复用。
  5. 做监控录像 → 别用 AVI!用 MP4 或者直接裸流存。

我的经验:如果你不确定选什么,就选 MP4。它可能不是最好的,但一定不会错。就像 C 语言在编程界的地位——不是最优雅的,但到处都能用。

避坑指南

最后分享几个我踩过的坑:

  • 坑一:MP4 不支持某些编码。比如 VP9 编码的视频不能直接装进 MP4,得用 WebM 容器。
  • 坑二:AVI 的音频视频交错方式可能导致音画不同步。我遇到过 AVI 文件在 VLC 上正常,在 Windows Media Player 上音画差 2 秒的情况。
  • 坑三:FLV 的元数据必须在文件头。如果直播流断了,元数据没写完,整个文件就废了。
  • 坑四:TS 格式虽然抗丢包,但文件体积比 MP4 大 10%-15%。因为每个包都有额外的头部信息。

嗯,封装格式这块儿就先聊到这儿。记住一句话:选容器看场景,选编码看需求。别盲目追求「最好的格式」,适合你的才是最好的。