音视频学习3-视频封装

268 阅读12分钟

视频封装格式深入学习报告

PS与TS封装格式原理、区别及应用场景分析

目标: 深入理解视频封装的必要性及PS、TS格式的技术特点


目录

  1. 视频封装基础概念
  2. 为什么需要封装
  3. PS封装格式详解
  4. TS封装格式详解
  5. PS与TS对比分析
  6. 实际应用场景
  7. 其他常见封装格式
  8. 学习总结与建议

1. 视频封装基础概念

1.1 什么是视频封装?

**视频封装(Container Format)**是将编码后的音视频数据、字幕、元数据等打包成一个文件的技术。

graph LR
    A[视频编码流<br/>H.264/H.265] --> D[封装格式<br/>PS/TS/MP4等]
    B[音频编码流<br/>AAC/MP3] --> D
    C[字幕数据<br/>SRT/ASS] --> D
    E[元数据<br/>时间戳/同步信息] --> D
    D --> F[最终视频文件<br/>.mp4/.ts/.mkv]

1.2 封装与编码的关系

重要概念区分:

编码(Codec):压缩音视频数据的算法
- 视频编码:H.264、H.265、VP9等
- 音频编码:AAC、MP3、AC-3等

封装(Container):组织和存储编码数据的格式
- 容器格式:MP4AVIMKV、TS、PS等

类比理解:

编码 = 压缩包里的文件内容
封装 = 压缩包的格式(ZIP、RAR、7Z)

同样的H.264视频可以封装在:
- MP4容器中:video.mp4
- TS容器中:video.ts  
- MKV容器中:video.mkv

1.3 封装格式的基本结构

graph TD
    A[封装格式文件] --> B[文件头<br/>Header]
    A --> C[数据包1<br/>Packet 1]
    A --> D[数据包2<br/>Packet 2]
    A --> E[...]
    A --> F[数据包N<br/>Packet N]
    A --> G[文件尾<br/>Footer]
    
    C --> C1[包头<br/>Packet Header]
    C --> C2[时间戳<br/>Timestamp]
    C --> C3[负载数据<br/>Payload Data]
    
    classDef header fill:#e3f2fd
    classDef packet fill:#f3e5f5
    classDef data fill:#e8f5e8
    
    class B,G header
    class C,D,E,F packet
    class C1,C2,C3 data

2. 为什么需要封装

2.1 封装解决的核心问题

2.1.1 多媒体同步问题

问题描述: 音视频是独立编码的两个数据流,播放时必须保持同步。

timeline
    title 音视频同步示例
    section 时间轴
        0ms    : 视频帧1 : 音频帧1-10
        33ms   : 视频帧2 : 音频帧11-20  
        67ms   : 视频帧3 : 音频帧21-30
        100ms  : 视频帧4 : 音频帧31-40

同步机制:

PTS (Presentation Time Stamp):显示时间戳
- 告诉播放器何时显示这一帧
- 确保音视频同步播放

DTS (Decode Time Stamp):解码时间戳  
- 告诉解码器何时开始解码
- 处理B帧等需要未来帧参考的情况

同步示例:

视频流:
帧1: PTS=0ms,    DTS=0ms
帧2: PTS=33ms,   DTS=33ms  
帧3: PTS=67ms,   DTS=67ms

音频流:
帧1: PTS=0ms,    DTS=0ms
帧2: PTS=23ms,   DTS=23ms
帧3: PTS=46ms,   DTS=46ms
2.1.2 流标识与管理

问题: 一个文件可能包含多个音视频流,需要标识和管理。

多音轨电影文件:
├── 视频流 (PID: 256)
├── 中文音轨 (PID: 257)  
├── 英文音轨 (PID: 258)
├── 中文字幕 (PID: 259)
└── 英文字幕 (PID: 260)
2.1.3 错误检测与纠正

网络传输问题:

原始数据包:[H1][Data1][H2][Data2][H3][Data3]
丢包后:     [H1][Data1][XX][XXXX][H3][Data3]

封装提供的解决方案:

  • 校验和:检测数据包完整性
  • 序列号:检测丢包和乱序
  • 冗余信息:用于错误恢复
2.1.4 随机访问支持

问题: 用户需要快进、快退、跳转到任意时间点。

解决方案:

索引表结构:
时间点    文件位置     帧类型
00:00    0KB         I帧
00:10    1.2MB       I帧  
00:20    2.5MB       I帧
00:30    3.8MB       I帧

2.2 封装添加的关键信息

2.2.1 时间信息
graph TD
    A[原始编码数据] --> B[添加时间戳]
    B --> C[PTS: 显示时间]
    B --> D[DTS: 解码时间]
    B --> E[PCR: 系统时钟参考]
    
    C --> F[确保正确显示时序]
    D --> G[确保正确解码顺序]
    E --> H[系统时钟同步]

时间戳精度:

MPEG标准:90kHz时钟
- 1秒 = 90,000个时钟周期
- 精度 ≈ 11.1微秒

示例:
30fps视频,每帧间隔 = 90000/30 = 3000个时钟周期
2.2.2 同步信息

同步字节(Sync Byte):

作用:标记数据包的起始位置
TS格式:0x47 (固定值)
PS格式:0x000001BA (包起始码)

数据流示例:
[0x47][包头][数据][0x47][包头][数据][0x47]...
  ↑                    ↑                ↑
同步字节            同步字节          同步字节
2.2.3 纠错信息

循环冗余校验(CRC):

CRC计算示例:
原始数据:1010110011
CRC多项式:1011
计算得CRC:101

传输数据:1010110011101
接收端重新计算CRC,比较是否一致

前向纠错(FEC):

Reed-Solomon编码:
原始数据:[D1][D2][D3][D4]
添加冗余:[D1][D2][D3][D4][R1][R2]

即使丢失2个数据包,仍可恢复原始数据

3. PS封装格式详解

3.1 PS格式概述

**PS(Program Stream)**是MPEG-2标准定义的封装格式,主要用于存储和本地播放。

特点:

  • 面向存储设计
  • 可变长度数据包
  • 支持随机访问
  • 错误敏感

3.2 PS格式结构

graph TD
    A[PS文件] --> B[包头<br/>Pack Header]
    A --> C[系统头<br/>System Header]
    A --> D[PES包1<br/>视频数据]
    A --> E[PES包2<br/>音频数据]
    A --> F[PES包3<br/>视频数据]
    A --> G[...]
    A --> H[程序结束码<br/>Program End Code]
    
    B --> B1[包起始码<br/>0x000001BA]
    B --> B2[系统时钟参考<br/>SCR]
    B --> B3[比特率<br/>Bit Rate]
    
    D --> D1[包起始码<br/>0x000001E0-0x000001EF]
    D --> D2[PTS/DTS]
    D --> D3[视频数据载荷]
    
    classDef header fill:#e3f2fd
    classDef data fill:#e8f5e8
    classDef system fill:#fff3e0
    
    class B,C,H header
    class D,E,F,G data
    class B1,B2,B3,D1,D2,D3 system

3.3 PS包头结构

Pack Header详细结构:

位长度    字段名称           说明
32位     起始码             0x000001BA
2位      标记位             固定为'01'
3位      SCR[32..30]       系统时钟参考高31位      标记位             固定为'1'
15位     SCR[29..15]       系统时钟参考中151位      标记位             固定为'1'
15位     SCR[14..0]        系统时钟参考低151位      标记位             固定为'1'
9位      SCR扩展           时钟扩展
1位      标记位             固定为'1'
22位     比特率             以50字节/秒为单位
2位      标记位             固定为'11'
5位      保留字段          固定为'11111'
3位      填充长度          可选填充字节数

3.4 PES包结构

graph LR
    A[PES包] --> B[PES包头<br/>6-12字节]
    A --> C[可选字段<br/>0-N字节]
    A --> D[负载数据<br/>音视频ES流]
    
    B --> B1[起始码<br/>24位]
    B --> B2[流ID<br/>8位]
    B --> B3[包长度<br/>16位]
    
    C --> C1[PTS<br/>33位]
    C --> C2[DTS<br/>33位]
    C --> C3[其他可选字段]

流ID分配:

视频流:0xE0 - 0xEF (最多16个视频流)
音频流:0xC0 - 0xDF (最多32个音频流)
字幕流:0x20 - 0x3F
专用流:0xBD (AC-3, DTS等)

3.5 PS格式优缺点

优点:

  1. 随机访问好:支持快速定位和跳转
  2. 存储效率高:可变包长,减少浪费
  3. 结构简单:相对容易解析
  4. 兼容性好:广泛支持

缺点:

  1. 错误敏感:一个错误可能影响整个文件
  2. 不适合网络传输:缺乏容错机制
  3. 实时性差:不适合流媒体应用

4. TS封装格式详解

4.1 TS格式概述

**TS(Transport Stream)**是MPEG-2标准定义的传输流格式,专门为网络传输和广播设计。

特点:

  • 面向传输设计
  • 固定188字节包长
  • 强容错能力
  • 支持多路复用

4.2 TS格式整体结构

graph TD
    A[TS流] --> B[TS包1<br/>188字节]
    A --> C[TS包2<br/>188字节]
    A --> D[TS包3<br/>188字节]
    A --> E[...]
    A --> F[TS包N<br/>188字节]
    
    B --> B1[同步字节<br/>0x47]
    B --> B2[包头<br/>3字节]
    B --> B3[自适应字段<br/>可选]
    B --> B4[负载<br/>剩余字节]
    
    C --> C1[同步字节<br/>0x47]
    C --> C2[包头<br/>3字节]
    C --> C3[自适应字段<br/>可选]
    C --> C4[负载<br/>剩余字节]
    
    classDef sync fill:#ffcdd2
    classDef header fill:#e1f5fe
    classDef adapt fill:#f3e5f5
    classDef payload fill:#e8f5e8
    
    class B1,C1 sync
    class B2,C2 header
    class B3,C3 adapt
    class B4,C4 payload

4.3 TS包头结构

TS包头详细结构(4字节):

位数     字段名称                说明
8位      同步字节               固定0x47
1位      传输错误指示符         0=无错误,1=有错误
1位      载荷单元起始指示符     0=中间包,1=起始包
1位      传输优先级             0=低优先级,1=高优先级
13位     PID                   包标识符
2位      加扰控制               00=不加扰
2位      自适应字段控制         适应字段存在标志
4位      连续性计数器           防止丢包检测

PID分配表:

PID值范围     用途
0x0000       PAT (Program Association Table)
0x0001       CAT (Conditional Access Table)  
0x0002-0x000F 保留
0x0010-0x1FFE 用户定义
0x1FFF       空包填充

常见PID示例:
0x0100       视频流
0x0101       音频流1
0x0102       音频流2
0x0103       字幕流

4.4 PSI表结构

PAT(节目关联表):

作用:列出所有节目及其PMT的PID
结构:
- 表ID: 0x00
- 节目号 -> PMT_PID映射

示例:
节目1 (program_number=1) -> PMT_PID=0x1000
节目2 (program_number=2) -> PMT_PID=0x2000

PMT(节目映射表):

作用:列出节目中的所有基本流
结构:
- 表ID: 0x02  
- PCR_PID: 时钟参考PID
- 流信息列表

示例PMT:
PCR_PID: 0x0100
视频流: PID=0x0100, 类型=0x1B (H.264)
音频流: PID=0x0101, 类型=0x0F (AAC)
字幕流: PID=0x0102, 类型=0x06

4.5 TS多路复用示例

gantt
    title TS多路复用时序图
    dateFormat X
    axisFormat %s
    
    section PAT/PMT
    PAT包        :0, 1
    PMT包        :1, 2
    
    section 视频流
    视频包1       :0, 3
    视频包2       :5, 8
    视频包3       :10, 13
    
    section 音频流  
    音频包1       :2, 4
    音频包2       :6, 8
    音频包3       :9, 11
    
    section PCR
    PCR更新       :3, 4
    PCR更新       :8, 9

4.6 TS错误恢复机制

同步恢复:

丢失同步情况:
[0x47][数据][XX][数据][0x47][数据]
           ↑
       丢失同步字节

恢复方法:
1. 检测到非0x47字节
2. 向前搜索下一个0x47
3. 验证188字节后是否还是0x47
4. 确认后重新同步

连续性检查:

正常序列:
包1: CC=0, 包2: CC=1, 包3: CC=2, 包4: CC=3

检测丢包:
包1: CC=0, 包2: CC=1, 包3: CC=3 ← 检测到CC=2丢失

处理:
- 记录丢包位置
- 请求重传(如果可能)
- 或跳过损坏的帧

5. PS与TS对比分析

5.1 技术特征对比

特征PS (Program Stream)TS (Transport Stream)
包长度可变长度固定188字节
同步方式起始码0x000001BA同步字节0x47
容错能力弱,错误敏感强,专为传输设计
随机访问优秀,支持快速定位一般,需要PSI表
多路复用简单交替复杂时分复用
开销较低较高(固定包头)
实时性不适合优秀

5.2 数据结构对比

graph LR
    subgraph PS格式
        A1[Pack Header] --> A2[System Header]
        A2 --> A3[PES包1<br/>可变长]
        A3 --> A4[PES包2<br/>可变长]
        A4 --> A5[...]
    end
    
    subgraph TS格式  
        B1[TS包1<br/>188字节] --> B2[TS包2<br/>188字节]
        B2 --> B3[TS包3<br/>188字节]  
        B3 --> B4[TS包4<br/>188字节]
        B4 --> B5[...]
    end

5.3 错误处理对比

PS格式错误传播:

错误场景:
[正常包][错误包][正常包][正常包]
    ↓
影响范围:整个PES包都可能受影响

后果:
- 可能导致整帧丢失
- 影响时间戳解析
- 播放卡顿或花屏

TS格式错误隔离:

错误场景:
[正常TS包][错误TS包][正常TS包][正常TS包]
     ↓
影响范围:仅188字节数据

恢复机制:
1. 错误检测(同步字节、CC计数器)
2. 错误隔离(固定包长)
3. 快速恢复(下个同步字节)

5.4 应用场景适配性

graph TD
    A[应用场景] --> B[存储播放]
    A --> C[网络传输]
    A --> D[广播电视]
    A --> E[流媒体]
    
    B --> B1[PS格式✓<br/>随机访问好<br/>存储效率高]
    B --> B2[TS格式△<br/>开销较大]
    
    C --> C1[PS格式✗<br/>错误敏感<br/>不适合传输]
    C --> C2[TS格式✓<br/>容错能力强<br/>实时性好]
    
    D --> D1[PS格式✗<br/>无纠错机制]
    D --> D2[TS格式✓<br/>专为广播设计]
    
    E --> E1[PS格式✗<br/>缓冲要求高]
    E --> E2[TS格式✓<br/>低延迟传输]

6. 实际应用场景

6.1 DVD/蓝光光盘

PS格式应用:

DVD结构:
VIDEO_TS/
├── VIDEO_TS.IFO    (导航信息)
├── VTS_01_0.IFO    (标题信息)
├── VTS_01_1.VOB    (PS格式视频文件)
├── VTS_01_2.VOB
└── ...

特点:
- 文件存储,无传输要求
- 需要快速跳转和随机访问
- 存储空间宝贵,要求高效率

技术细节:

VOB文件格式:
- 基于PS格式
- 最大文件大小:1GB
- 支持多音轨、多字幕
- 包含导航信息

音视频规格:
- 视频:MPEG-2, 720×480/720×576
- 音频:AC-3, PCM, DTS
- 比特率:最高9.8Mbps

6.2 数字电视广播

TS格式应用:

DVB-T/ATSC/ISDB-T广播系统:
天线接收 → 调谐器 → TS解复用 → 音视频解码 → 显示

传输特点:
- 无线传输,易受干扰
- 多个频道复用传输
- 需要实时播放
- 无重传机制

复用结构示例:

一个6MHz频道可传输:
├── 高清频道1 (1920×1080, 15Mbps)
├── 标清频道2 (720×480, 3Mbps)  
├── 标清频道3 (720×480, 3Mbps)
├── 数据服务 (1Mbps)
└── EPG信息 (0.5Mbps)
总计:22.5Mbps

6.3 IPTV系统

TS格式优势:

IPTV传输链路:
节目源 → 编码 → TS封装 → IP封装 → 网络传输 → 机顶盒

网络传输特点:
- UDP/RTP传输
- 可能丢包、乱序
- 需要快速恢复
- 支持组播

QoS保证机制:

网络层:
- 带宽预留
- 优先级队列
- 流量整形

应用层:
- FEC前向纠错
- 重传机制(unicast)
- 自适应码率

6.4 在线视频流

现代流媒体格式选择:

HLS (HTTP Live Streaming):

格式:TS片段 + M3U8播放列表
结构:
playlist.m3u8:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:10
#EXTINF:10.0,
segment001.ts
#EXTINF:10.0,
segment002.ts
...

DASH (Dynamic Adaptive Streaming):

格式:MP4片段 + MPD清单
优势:
- 更好的压缩效率
- 支持更多编码格式
- 更灵活的自适应机制

6.5 监控系统

格式选择考虑:

实时监控:TS格式
- 低延迟要求(<500ms)
- 网络传输优化
- 支持多路流

录像存储:PS/MP4格式
- 存储效率优先
- 支持快速检索
- 兼容性要求

7. 其他常见封装格式

7.1 MP4格式

MP4特点:

基础:ISO基础媒体文件格式
结构:原子(Atom/Box)层次结构
优势:
- 网络友好(支持渐进下载)
- 广泛兼容
- 支持多种编码
- 元数据丰富

MP4 vs PS/TS:

MP4优势:
- 更现代的设计
- 更好的网络支持
- 更丰富的元数据
- 更灵活的结构

局限性:
- 较新格式,老设备可能不支持
- 结构复杂,解析开销大

7.2 其他格式简介

AVI格式:

特点:微软开发,结构简单
优势:兼容性好,支持多种编码
劣势:文件大小限制,功能有限

MKV格式:

特点:开源容器,功能强大
优势:支持所有编码格式,功能丰富
劣势:兼容性不如MP4,文件较大

FLV格式:

特点:Adobe开发,Flash专用
优势:网络流媒体优化
现状:Flash退役,逐渐淘汰

8. 学习总结与建议

8.1 关键知识点总结

封装的核心价值:

  1. 多媒体同步:确保音视频协调播放
  2. 流管理:组织和标识多个数据流
  3. 错误处理:检测和恢复传输错误
  4. 随机访问:支持快进、快退操作
  5. 元数据管理:存储文件信息和播放参数

PS vs TS选择指南:

flowchart TD
    A[选择封装格式] --> B{应用场景}
    
    B -->|本地存储| C[PS格式]
    B -->|网络传输| D[TS格式]
    B -->|广播电视| D
    B -->|流媒体| E[TS或现代格式]
    
    C --> C1[优势:存储效率高<br/>随机访问好]
    D --> D1[优势:容错能力强<br/>实时性好]
    E --> E1[HLS: TS片段<br/>DASH: MP4片段]

8.2 技术演进趋势

传统格式现状:

PS格式:
- 仍用于DVD/蓝光
- 逐渐被MP4替代
- 新应用较少

TS格式:
- 广播电视标准
- HLS流媒体核心
- 继续广泛使用

新兴趋势:

Web技术:
- WebM: VP9/AV1 + Opus
- 浏览器原生支持
- 开源无专利

云服务:
- 自适应流媒体
- 多格式自动转换  
- CDN优化分发

8.3 学习建议

理论学习路径:

  1. 基础概念:理解封装vs编码区别
  2. 同步机制:掌握PTS/DTS概念
  3. 格式结构:了解PS/TS内部组织
  4. 应用场景:明确不同格式适用范围

实践练习建议:

工具使用:

# 查看文件格式信息
ffprobe -v quiet -print_format json -show_format video.mp4

# 格式转换
ffmpeg -i input.mp4 -c copy output.ts
ffmpeg -i input.ts -c copy output.mp4

# 分析TS流结构
ffprobe -v quiet -show_packets -select_streams v:0 video.ts

分析练习:

1. 用hex编辑器查看TS文件同步字节
2. 分析不同格式的文件大小差异
3. 测试网络传输中的错误恢复
4. 比较不同格式的随机访问性能