在超越顶级(OTT)和实时通信(RTC)技术的世界中,文件打包和解包在管理和传输音视频内容中起着至关重要的作用。本文将深入探讨打包和解包的概念,重点介绍三种流行的容器格式:MP4、FLV 和 TS。
打包的必要性
当音频和视频数据经过各自的编码器后,我们通常会得到两个独立的数据流:一个用于音频的 AAC 流和一个用于视频的 H.264 流。这些流是分开的,因为它们来自不同的源(音频来自麦克风,视频来自摄像头),并由不同的组件处理。
然而,在实际应用中,音频和视频流很少单独使用。为了同步同一场景中的声音和画面,我们需要将音频和视频数据打包到一个文件中。
什么是打包?
打包,也称为复用或 muxing,是将多个数据流组合成一个单一容器文件的过程。打包的主要目的包括:
- 整合来自同一场景的信息。
- 便于音视频同步和统一配置。
结果打包后的文件称为容器。常见的容器格式包括 MP4、FLV、TS、AVI 和 MKV。
元数据:高效播放的关键
容器就像不同大小的盒子,有些支持多种编解码格式(如 MKV),而有些支持较少(如 AVI)。为了实现高效播放,容器包含元数据——关于打包媒体的信息。
元数据通常包括:
- 音频和视频的编解码信息
- 分辨率
- 帧速率
- 比特率
- 采样率
- 比特深度
- 音频通道数
当媒体播放器开始播放文件时,它首先读取元数据,以确定使用哪些编解码器以及在开始播放之前分配多少缓冲区空间。
对于具有“边下载边播放”功能的在线流媒体,确保元数据位于文件开头至关重要。一些打包格式将元数据放在末尾,这需要转码以移动元数据或在播放开始之前下载整个文件。
流行的容器格式
让我们探索三种在 OTT 和 RTC 系统中使用的流行容器格式:
1. MP4(MPEG-4 第 14 部分)
MP4 是一种多功能的媒体文件结构标准,可以嵌入各种类型的数据。大多数 MP4 文件包含 H.264 或 MPEG-4 编码的视频和 AAC 编码的音频。
MP4 文件结构为一系列嵌套的“盒子”。以下是一些常见的盒子类型:
盒子类型 | 描述 |
ftyp | 文件类型,指示文件格式 |
moov | 元数据容器,存储文件元数据 |
mvhd | 电影头部,包含文件头部信息 |
trak | 轨道容器,包含音频/视频轨道信息 |
tkhd | 轨道头部,包含轨道头部信息 |
mdia | 媒体信息 |
mdhd | 媒体头部,定义媒体头部信息 |
hdlr | 处理程序,指定轨道类型(视频/音频/提示) |
minf | 媒体信息,包含媒体数据 |
stbl | 样本表,存储样本映射信息 |
mdat | 媒体数据容器,保存实际的媒体数据 |
2. FLV(Flash 视频)
FLV 是由 Adobe 开发的一种流行的网络视频容器格式。其简单的结构和易于解码使其非常适合在线视频,尤其是与 Adobe 的 RTMP 协议结合使用时。
FLV 文件由 FLV 头部和 FLV 主体组成:
FLV 头部 | 标签0 | 标签0 数据 | 标签1 | 标签1 数据 | ... | 标签N | 标签N 数据
FLV 主体包含多个标签,这些标签可以是音频、视频或脚本(用于关键字或文件信息)。
FLV 头部结构:
字段 | 描述 |
签名(3B) | 始终为 "FLV" (0x46 0x4C 0x56) |
版本(1B) | 版本号,通常为 0x01 |
标志(1B) | 位 5-7: 0,位 6: 音频标签存在,位 7: 视频标签存在 |
头部大小(4B) | FLV 头部的大小,通常为 9 |
FLV 主体结构(针对每个标签):
字段 | 描述 |
前一个标签大小 | 前一个标签的大小 |
标签类型 | 音频 (0x08),视频 (0x09),或脚本 (0x12) |
数据大小 | 标签数据部分的大小 |
时间戳 | 标签的时间戳 |
流 ID | 流标识符 |
标签数据 | 实际的媒体数据 |
3. TS(传输流)
TS,由 MPEG-2 标准定义,通常用于数字视频广播和 HTTP 实时流协议(HLS)。
TS 打包过程:
- 元素流(ES) - 原始编码的音频或视频数据
- 分组元素流(PES) - 将 ES 数据打包成 PES 数据包
- 传输流(TS) - 将 PES 数据包复用到 TS 数据包中
TS 数据包的固定大小为 188 字节,包含头部和有效载荷。
结论
理解文件打包和解包对任何从事 OTT 和 RTC 技术的人来说都是至关重要的。每种容器格式都有其优势,适用于不同的用例:
- MP4 广泛用于互联网视频点播服务
- FLV 在直播和视频点播中都很受欢迎
- TS 通常用于 HTML5 视频传送的 HLS 中
随着数字媒体领域的不断发展,及时了解这些容器格式及其应用将对开发高效、高质量的音视频流解决方案至关重要。