视频封装容器

封装容器

概述

视频封装容器(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

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Index