封装格式基础:容器、编码与你的视频文件
做视频处理这么多年,我经常被问到同一个问题:「老师,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 格式扛下来的。
容器与编码的关系
这是新手最容易搞混的地方。我画个图帮你理清楚:
你看,一个封装容器里可以包含多个轨道。每个轨道都有自己的编码格式。这就是为什么你可以:
- 把 H.264 视频 + AAC 音频装进 MP4
- 把 H.265 视频 + FLAC 音频装进 MKV
- 甚至把同一个视频用不同编码各存一份,放在同一个 MKV 里
关键点:转封装(改变容器格式)和转编码(改变视频编码)是完全不同的操作。转封装不损失画质,转编码会损失画质。我见过太多人把 MP4 转成 MKV 结果重新编码了一遍,白白损失了画质。
实际项目中的选择策略
说了这么多理论,咱们来点实际的。我一般这么选:
- 做在线视频网站 → MP4 + H.264 + AAC。兼容性最好,CDN 支持最成熟。
- 做蓝光原盘备份 → MKV + H.265 + FLAC。画质无损,体积小一半。
- 做直播推流 → FLV + H.264 + AAC。延迟低,结构简单。
- 做广播电视 → TS + H.264 + AAC。抗丢包,支持多节目复用。
- 做监控录像 → 别用 AVI!用 MP4 或者直接裸流存。
我的经验:如果你不确定选什么,就选 MP4。它可能不是最好的,但一定不会错。就像 C 语言在编程界的地位——不是最优雅的,但到处都能用。
避坑指南
最后分享几个我踩过的坑:
- 坑一:MP4 不支持某些编码。比如 VP9 编码的视频不能直接装进 MP4,得用 WebM 容器。
- 坑二:AVI 的音频视频交错方式可能导致音画不同步。我遇到过 AVI 文件在 VLC 上正常,在 Windows Media Player 上音画差 2 秒的情况。
- 坑三:FLV 的元数据必须在文件头。如果直播流断了,元数据没写完,整个文件就废了。
- 坑四:TS 格式虽然抗丢包,但文件体积比 MP4 大 10%-15%。因为每个包都有额外的头部信息。
嗯,封装格式这块儿就先聊到这儿。记住一句话:选容器看场景,选编码看需求。别盲目追求「最好的格式」,适合你的才是最好的。