一、封装格式概述:什么是封装格式、为什么需要封装、常见封装格式对比(MP4/TS/FLV/MKV)
大家好,我是你们这门课的老朋友。咱们今天开篇先聊点基础但极其重要的东西——封装格式。
你想想看,我们平时看视频,不管是手机里的 MP4,还是网页上的 FLV,或者电视直播里的 TS 流,这些文件的后缀名其实就是封装格式的身份证。但很多人干了几年流媒体,对封装的理解还停留在「不就是个容器嘛」的层面。嗯,这其实是个坑,我当年就踩过。
1.1 什么是封装格式?
封装格式,说白了就是一个「盒子」。这个盒子把视频轨道、音频轨道、字幕、章节信息、元数据(比如分辨率、码率、帧率)全部打包在一起。它不负责压缩视频,也不负责解码音频,它只负责「装」和「组织」。
举个例子:你用 H.264 编码器压出来一段视频裸流(.h264),用 AAC 编码器压出来一段音频裸流(.aac),这两者本身是没法直接播放的。你需要一个容器把它们合在一起,告诉播放器:「这段视频从第 0 秒到第 10 秒,对应的音频从第 0 秒到第 10 秒,同步播放。」这个容器就是封装格式。
核心要点:封装格式 = 容器 + 索引 + 时间轴。它解决的是「如何组织、索引、同步多路媒体流」的问题,而不是「如何压缩」的问题。
我个人习惯把封装格式比作一个快递箱。视频轨是衣服,音频轨是鞋子,字幕是说明书。箱子本身不生产这些东西,但它决定了你怎么放、怎么贴标签、怎么让收件人(播放器)方便地取出所有东西。
1.2 为什么需要封装?
你可能会问:直接把 H.264 裸流丢给播放器不行吗?行,但那是极客玩法。实际工程中,我们需要封装的原因至少有这几点:
- 同步问题:视频和音频是分开编码的,没有封装格式的时间戳(PTS/DTS),播放器根本不知道哪一帧画面配哪一段声音。我在项目中遇到过裸流播放音画不同步的惨案,后来发现就是封装层的时间戳没写对。
- 索引与随机访问:你想快进到第 30 分钟,如果没有索引表,播放器就得从头读到尾——这在 2 小时的电影里简直是灾难。封装格式里的 moov box(MP4)或者索引表(FLV)就是干这个的。
- 元数据承载:分辨率、帧率、编码器信息、旋转角度、甚至封面图,这些信息都靠封装格式来携带。没有它们,播放器只能猜,猜错了就花屏或者黑屏。
- 流式传输支持:直播场景下,封装格式必须支持「边下载边播放」。比如 FLV 的头部信息很小,可以快速开始播放;而 MP4 如果 moov box 放在文件末尾,就必须先下载完整个文件才能播——这就是为什么网页端经常用「fMP4」(分片 MP4)的原因。
避坑指南:我曾经在一个点播项目中,直接把 MP4 文件丢到 CDN 上,结果用户播放时首屏加载花了 10 秒。后来发现是 moov box 在文件末尾,播放器必须下载完整个文件才能开始播。解决方案是用工具把 moov box 移到文件头部(这叫「快速启动」或「moov atom 前置」)。
1.3 常见封装格式对比
市面上封装格式少说几十种,但咱们做流媒体工程,最常打交道的就四个:MP4、TS、FLV、MKV。我按自己的经验给你拆开讲讲。
| 特性 | MP4 | TS | FLV | MKV |
|---|---|---|---|---|
| 全称 | MPEG-4 Part 14 | MPEG Transport Stream | Flash Video | Matroska |
| 诞生时间 | 2001 年 | 1995 年(DVB 时代) | 2003 年 | 2002 年 |
| 主要用途 | 点播、移动端、网页 | 直播、广播电视、HLS | 直播、网页播放(Flash 时代) | 本地存储、高清收藏 |
| 索引方式 | moov box(可前置/后置) | 无全局索引,靠 PAT/PMT | 文件头 + 索引表(可后加) | EBML + Segment + Cues |
| 流式支持 | 需 fMP4 或 moov 前置 | 天生支持(188 字节小包) | 天生支持(头部小) | 不擅长(需加载完整索引) |
| 容错性 | 差(一个 box 损坏可能全废) | 极强(丢包不影响其他包) | 中等(Tag 结构清晰) | 强(可内嵌多个附件) |
| 编码支持 | H.264/H.265/AAC/MP3 | 几乎任何编码 | H.264/AAC/MP3(VP6 已淘汰) | 几乎任何编码(开源优势) |
| 元数据丰富度 | 中等 | 低(主要靠 PSI/SI) | 低(只有基本信息) | 极高(章节、附件、字体) |
这张表你最好收藏一下,以后选封装格式时直接翻出来看。我个人习惯是:点播用 MP4,直播用 FLV 或 TS,本地收藏用 MKV。但这不是绝对的,具体场景要具体分析。
MP4:行业老大哥
MP4 是目前兼容性最好的封装格式。从 iPhone 到 Android,从 Chrome 到 Safari,从 OBS 到 Premiere,没人不认识它。它的核心结构基于 ISO Base Media File Format(ISOBMFF),用「box」来组织数据。
但 MP4 有个致命弱点:moov box 的位置。如果 moov box 在文件末尾,播放器必须下载完整个文件才能开始播放。这在点播场景下是灾难。所以现在业界普遍用「fMP4」(Fragmented MP4),把 moov box 拆成多个 moof box,每个分片独立索引,适合 DASH 和 HLS 的 fMP4 模式。
注意:MP4 的容错性其实很差。如果文件中间某个 box 损坏,后面的数据可能全部无法解析。我曾经在录制设备上遇到过断电导致 MP4 文件损坏的情况,修复起来非常麻烦。所以录制场景我建议用 TS 或者先录成 FLV 再转封装。
TS:直播老炮
TS(Transport Stream)是 DVB 和 ATSC 标准里定义的封装格式,专门为广播电视设计。它的基本单位是 188 字节的 TS 包,每个包都有同步头,所以抗丢包能力极强。哪怕你丢了 10% 的包,播放器依然能解析出剩下的内容——最多花屏一下,不会整个崩溃。
HLS(HTTP Live Streaming)最初就是用 TS 作为封装格式,每个切片是一个 .ts 文件。虽然现在 HLS 也支持 fMP4 了,但 TS 在直播场景下的地位依然稳固。
不过 TS 也有缺点:元数据支持极差。你想在 TS 里加个章节信息?基本不可能。它的 PSI/SI 表只能传递最基本的节目信息,连分辨率都得靠视频流里的 SPS/PPS 来猜。
FLV:网页直播老兵
FLV 是 Adobe 搞出来的,当年 Flash 统治网页时,FLV 就是直播和点播的标配。它的结构很简单:文件头 + 若干个 Tag(音频 Tag、视频 Tag、脚本 Tag)。每个 Tag 都有时间戳,所以天然支持流式播放。
现在 Flash 已经死了,但 FLV 还活着。为什么?因为 RTMP 协议传输的就是 FLV 数据。你在 OBS 里推流到服务器,底层就是 FLV over RTMP。很多 CDN 的直播接入也依然用 FLV。
FLV 的缺点也很明显:编码支持有限。H.265 和 AV1 在 FLV 里没有标准定义,虽然可以自己扩展,但兼容性就不好说了。另外 FLV 的元数据也很弱,只能通过 onMetaData 脚本传递一些基本信息。
MKV:开源全能王
MKV(Matroska)是开源社区的杰作。它的结构基于 EBML(类似 XML 的二进制格式),非常灵活。你可以把任意数量的视频轨、音频轨、字幕轨、附件(字体、图片)塞进去,还能加章节、标签、甚至菜单。
MKV 在本地收藏和蓝光 RIP 场景下几乎是标准。但它在流媒体领域不太行——因为它的索引表(Cues)通常放在文件末尾,而且文件体积大,不适合网络传输。不过现在也有 WebM(基于 MKF 的子集,用于 VP8/VP9 编码)在网页端使用。
一句话总结:MP4 是「兼容之王」,TS 是「直播铁汉」,FLV 是「老兵不死」,MKV 是「收藏神器」。选哪个,看你的场景。
1.4 封装格式的核心知识体系
为了让你更直观地理解封装格式在整个流媒体系统中的位置,我画了一张图。这张图展示了从原始媒体到最终播放的完整链路,封装格式处于「编码之后、传输之前」的关键位置。
从这张图你可以看到:封装格式是连接编码器和传输协议的桥梁。没有它,编码后的裸流就是一盘散沙;没有它,播放器无法知道什么时候该播哪一帧。我们这门课后面会深入每个格式的二进制结构,手把手教你解析和封装数据流。
1.5 怎么选封装格式?
最后给你一个实战中的选择指南。别纠结,按场景来:
- 点播(VOD):首选 MP4(moov 前置),兼容性最好。如果要做自适应码率,用 fMP4 分片。
- 直播(Live):RTMP 推流用 FLV,HLS 分发用 TS 或 fMP4。如果网络环境差,TS 更抗丢包。
- 本地存储/备份:MKV,能塞字幕、章节、多音轨,而且开源无专利风险。
- 移动端 H5 播放:MP4(H.264 + AAC),所有浏览器都支持。
- 广电/专业设备:TS,因为它是行业标准,设备兼容性最好。
我的经验:如果你刚开始做流媒体项目,先别碰 MKV 和 TS 的解析,从 MP4 和 FLV 入手。这两个格式的文档最全,社区工具最多,踩坑了也容易找到答案。我当年就是从 FLV 的 Tag 解析开始入门的,那会儿还在用 Flash Player,现在想想都是回忆。