封装容器
概述
视频封装容器(Container Format)用于将编码后的视频、音频、字幕等数据打包在一起,并提供元数据信息。不同的容器格式有不同的特点和适用场景。
FLV (Flash Video)
基本介绍
FLV 是 Adobe 开发的视频容器格式,最初用于 Flash Player 播放。
特点
- 文件结构简单:Header + Tag 结构,易于解析
- 支持流式传输:适合实时流媒体传输
- 低延迟:适合直播场景
- 文件体积小:元数据开销较小
- 支持格式:H.264、VP6、Sorenson Spark 等视频编码;AAC、MP3 等音频编码
应用场景
- 直播推流:RTMP 协议通常使用 FLV 格式
- 在线视频:早期 Web 视频播放(Flash 时代)
- CDN 分发:流媒体 CDN 常用格式
优势
- 解析简单,实现容易
- 支持边下载边播放(流式播放)
- 延迟低,适合实时场景
- 广泛支持,兼容性好
劣势
- Flash 技术已淘汰,浏览器支持有限
- 不支持现代编码格式(如 H.265、VP9)
- 功能相对简单,扩展性有限
文件结构
- Header:文件头,包含版本、类型等信息
- Tag:数据标签,包含视频帧、音频帧、脚本数据等
- Tag Header:包含时间戳、数据大小、类型等信息
TS (Transport Stream)
基本介绍
TS 是 MPEG-2 标准定义的传输流格式,主要用于数字电视广播和流媒体传输。
特点
- 标准格式:MPEG-2 标准,广泛采用
- 容错性强:支持错误检测和恢复
- 多路复用:可同时传输多路音视频流
- 支持格式:H.264、H.265、MPEG-2 等视频编码;AAC、MP3、AC-3 等音频编码
- 元数据丰富:支持节目信息、字幕、EPG 等
应用场景
- 数字电视广播:DVB、ATSC 等标准
- HLS 流媒体:Apple HLS 使用 TS 分段
- IPTV:网络电视传输
- 直播分发:CDN 直播流传输
优势
- 标准化程度高,兼容性好
- 容错能力强,适合网络传输
- 支持多路复用,功能丰富
- 广泛用于广播电视和流媒体
劣势
- 文件头开销较大
- 解析相对复杂
- 延迟相对较高(相比 FLV)
文件结构
- TS Packet:固定 188 字节的数据包
- PAT (Program Association Table):节目关联表
- PMT (Program Map Table):节目映射表
- PES (Packetized Elementary Stream):打包的基本流
- PSI (Program Specific Information):节目特定信息
H.264 打包成 TS 流步骤
H.264 视频流打包成 TS 流需要经过多个步骤,将 NAL 单元转换为 TS 数据包。
打包流程
flowchart TD
A[H.264 编码数据] --> B[提取 NAL 单元]
B --> C{NAL 单元类型}
C -->|SPS/PPS| D[保存参数集]
C -->|IDR/I帧| E[构建 PES 包]
C -->|P/B帧| E
D --> F[构建 PSI 表]
F --> G[生成 PAT 表]
G --> H[生成 PMT 表]
H --> I[PSI 表打包成 TS Packet]
E --> J[添加 PES 头]
J --> K[PES 数据分段]
K --> L[分段打包成 TS Packet]
I --> M[输出 TS 流]
L --> M
M --> N[完成 TS 流]
style A fill:#e1f5ff
style N fill:#d4edda
style F fill:#fff3cd
style E fill:#fff3cd
详细步骤
1. 提取 NAL 单元
– 从 H.264 编码数据中提取 NAL (Network Abstraction Layer) 单元
– 识别 NAL 单元类型:SPS、PPS、IDR、I帧、P帧、B帧等
– 保存 SPS 和 PPS 参数集,用于后续构建 PSI 表
2. 构建 PSI 表
– PAT (Program Association Table):
– 创建节目关联表,定义节目 ID 和对应的 PMT PID
– 通常 PID 为 0x0000
– PMT (Program Map Table):
– 创建节目映射表,定义视频流、音频流的 PID 和编码格式
– 包含 H.264 视频流的描述信息(从 SPS/PPS 提取)
– 通常视频流 PID 为 0x0100,音频流 PID 为 0x0101
3. 构建 PES 包
– PES 头信息:
– 流 ID(视频流通常为 0xE0)
– PES 包长度
– 时间戳(PTS/DTS)
– 标志位(数据对齐、版权等)
– PES 负载:
– 将 NAL 单元数据作为 PES 负载
– 对于关键帧,通常先插入 SPS/PPS(如果之前未发送)
4. PES 打包成 TS Packet
– TS 包头(4 字节):
– 同步字节(0x47)
– 传输错误指示、负载单元开始指示
– PID(包标识符)
– 传输加扰控制、适配域控制
– 连续计数器
– 适配域(可选):
– 当 PES 包边界或需要 PCR(Program Clock Reference)时添加
– 包含 PCR、随机访问指示等
– TS 负载:
– 将 PES 数据分段填充到 TS Packet 的负载部分(184 字节)
– 如果 PES 数据大于 184 字节,需要分多个 TS Packet
5. 输出 TS 流
– 按照标准顺序输出:
1. PAT 表的 TS Packet(定期重复,通常每 100ms)
2. PMT 表的 TS Packet(定期重复,通常每 100ms)
3. 视频 PES 的 TS Packet
4. 音频 PES 的 TS Packet(如果存在)
– 每个 TS Packet 固定 188 字节
关键要点
- 时间戳同步:PTS(Presentation Time Stamp)和 DTS(Decode Time Stamp)必须正确设置
- PCR 插入:定期插入 PCR 用于时钟同步(通常每 40ms)
- 关键帧处理:IDR 帧前需要确保 SPS/PPS 已发送
- 连续计数器:每个 PID 的连续计数器必须连续递增(0-15 循环)
- PSI 表重复:PAT 和 PMT 需要定期重复发送,确保接收端能正确解析
TS vs FLV
| 特性 | TS | FLV |
|---|---|---|
| 标准 | MPEG-2 标准 | Adobe 专有 |
| 复杂度 | 较高 | 较低 |
| 容错性 | 强 | 中等 |
| 延迟 | 较高 | 较低 |
| 多路复用 | 支持 | 不支持 |
| 应用场景 | 广播电视、HLS | 直播推流、RTMP |
| 浏览器支持 | 良好(HLS) | 有限(Flash 已淘汰) |
其他常见容器格式
MP4
- 特点:广泛使用的容器格式,支持多种编码
- 应用:点播、下载、移动设备
- 优势:兼容性最好,功能完善
MKV
- 特点:开源容器格式,功能强大
- 应用:高清视频存储、多音轨/多字幕支持
- 优势:扩展性强,支持几乎所有编码格式
WebM
- 特点:Google 开发的 Web 视频格式
- 应用:HTML5 视频播放
- 优势:开源免费,Web 原生支持
选择建议
- 直播推流:优先使用 FLV(RTMP)或 TS(HLS)
- 点播服务:优先使用 MP4
- 广播电视:使用 TS
- Web 播放:优先使用 MP4 或 WebM
- 跨平台兼容:优先使用 MP4
