视频封装格式深入学习报告
PS与TS封装格式原理、区别及应用场景分析
目标: 深入理解视频封装的必要性及PS、TS格式的技术特点
目录
1. 视频封装基础概念
1.1 什么是视频封装?
**视频封装(Container Format)**是将编码后的音视频数据、字幕、元数据等打包成一个文件的技术。
graph LR
A[视频编码流
H.264/H.265] --> D[封装格式
PS/TS/MP4等] B[音频编码流
AAC/MP3] --> D C[字幕数据
SRT/ASS] --> D E[元数据
时间戳/同步信息] --> D D --> F[最终视频文件
.mp4/.ts/.mkv]
H.264/H.265] --> D[封装格式
PS/TS/MP4等] B[音频编码流
AAC/MP3] --> D C[字幕数据
SRT/ASS] --> D E[元数据
时间戳/同步信息] --> D D --> F[最终视频文件
.mp4/.ts/.mkv]
1.2 封装与编码的关系
重要概念区分:
objectivec
编码(Codec):压缩音视频数据的算法
- 视频编码:H.264、H.265、VP9等
- 音频编码:AAC、MP3、AC-3等
封装(Container):组织和存储编码数据的格式
- 容器格式:MP4、AVI、MKV、TS、PS等
类比理解:
css
编码 = 压缩包里的文件内容
封装 = 压缩包的格式(ZIP、RAR、7Z)
同样的H.264视频可以封装在:
- MP4容器中:video.mp4
- TS容器中:video.ts
- MKV容器中:video.mkv
1.3 封装格式的基本结构
graph TD
A[封装格式文件] --> B[文件头
Header] A --> C[数据包1
Packet 1] A --> D[数据包2
Packet 2] A --> E[...] A --> F[数据包N
Packet N] A --> G[文件尾
Footer] C --> C1[包头
Packet Header] C --> C2[时间戳
Timestamp] C --> C3[负载数据
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
Header] A --> C[数据包1
Packet 1] A --> D[数据包2
Packet 2] A --> E[...] A --> F[数据包N
Packet N] A --> G[文件尾
Footer] C --> C1[包头
Packet Header] C --> C2[时间戳
Timestamp] C --> C3[负载数据
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
同步机制:
diff
PTS (Presentation Time Stamp):显示时间戳
- 告诉播放器何时显示这一帧
- 确保音视频同步播放
DTS (Decode Time Stamp):解码时间戳
- 告诉解码器何时开始解码
- 处理B帧等需要未来帧参考的情况
同步示例:
ini
视频流:
帧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 流标识与管理
问题: 一个文件可能包含多个音视频流,需要标识和管理。
scss
多音轨电影文件:
├── 视频流 (PID: 256)
├── 中文音轨 (PID: 257)
├── 英文音轨 (PID: 258)
├── 中文字幕 (PID: 259)
└── 英文字幕 (PID: 260)
2.1.3 错误检测与纠正
网络传输问题:
css
原始数据包:[H1][Data1][H2][Data2][H3][Data3]
丢包后: [H1][Data1][XX][XXXX][H3][Data3]
封装提供的解决方案:
- 校验和:检测数据包完整性
- 序列号:检测丢包和乱序
- 冗余信息:用于错误恢复
2.1.4 随机访问支持
问题: 用户需要快进、快退、跳转到任意时间点。
解决方案:
makefile
索引表结构:
时间点 文件位置 帧类型
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[系统时钟同步]
时间戳精度:
diff
MPEG标准:90kHz时钟
- 1秒 = 90,000个时钟周期
- 精度 ≈ 11.1微秒
示例:
30fps视频,每帧间隔 = 90000/30 = 3000个时钟周期
2.2.2 同步信息
同步字节(Sync Byte):
scss
作用:标记数据包的起始位置
TS格式:0x47 (固定值)
PS格式:0x000001BA (包起始码)
数据流示例:
[0x47][包头][数据][0x47][包头][数据][0x47]...
↑ ↑ ↑
同步字节 同步字节 同步字节
2.2.3 纠错信息
循环冗余校验(CRC):
CRC计算示例:
原始数据:1010110011
CRC多项式:1011
计算得CRC:101
传输数据:1010110011101
接收端重新计算CRC,比较是否一致
前向纠错(FEC):
css
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[包头
Pack Header] A --> C[系统头
System Header] A --> D[PES包1
视频数据] A --> E[PES包2
音频数据] A --> F[PES包3
视频数据] A --> G[...] A --> H[程序结束码
Program End Code] B --> B1[包起始码
0x000001BA] B --> B2[系统时钟参考
SCR] B --> B3[比特率
Bit Rate] D --> D1[包起始码
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
Pack Header] A --> C[系统头
System Header] A --> D[PES包1
视频数据] A --> E[PES包2
音频数据] A --> F[PES包3
视频数据] A --> G[...] A --> H[程序结束码
Program End Code] B --> B1[包起始码
0x000001BA] B --> B2[系统时钟参考
SCR] B --> B3[比特率
Bit Rate] D --> D1[包起始码
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详细结构:
arduino
位长度 字段名称 说明
32位 起始码 0x000001BA
2位 标记位 固定为'01'
3位 SCR[32..30] 系统时钟参考高3位
1位 标记位 固定为'1'
15位 SCR[29..15] 系统时钟参考中15位
1位 标记位 固定为'1'
15位 SCR[14..0] 系统时钟参考低15位
1位 标记位 固定为'1'
9位 SCR扩展 时钟扩展
1位 标记位 固定为'1'
22位 比特率 以50字节/秒为单位
2位 标记位 固定为'11'
5位 保留字段 固定为'11111'
3位 填充长度 可选填充字节数
3.4 PES包结构
graph LR
A[PES包] --> B[PES包头
6-12字节] A --> C[可选字段
0-N字节] A --> D[负载数据
音视频ES流] B --> B1[起始码
24位] B --> B2[流ID
8位] B --> B3[包长度
16位] C --> C1[PTS
33位] C --> C2[DTS
33位] C --> C3[其他可选字段]
6-12字节] A --> C[可选字段
0-N字节] A --> D[负载数据
音视频ES流] B --> B1[起始码
24位] B --> B2[流ID
8位] B --> B3[包长度
16位] C --> C1[PTS
33位] C --> C2[DTS
33位] C --> C3[其他可选字段]
流ID分配:
scss
视频流:0xE0 - 0xEF (最多16个视频流)
音频流:0xC0 - 0xDF (最多32个音频流)
字幕流:0x20 - 0x3F
专用流:0xBD (AC-3, DTS等)
3.5 PS格式优缺点
优点:
- 随机访问好:支持快速定位和跳转
- 存储效率高:可变包长,减少浪费
- 结构简单:相对容易解析
- 兼容性好:广泛支持
缺点:
- 错误敏感:一个错误可能影响整个文件
- 不适合网络传输:缺乏容错机制
- 实时性差:不适合流媒体应用
4. TS封装格式详解
4.1 TS格式概述
**TS(Transport Stream)**是MPEG-2标准定义的传输流格式,专门为网络传输和广播设计。
特点:
- 面向传输设计
- 固定188字节包长
- 强容错能力
- 支持多路复用
4.2 TS格式整体结构
graph TD
A[TS流] --> B[TS包1
188字节] A --> C[TS包2
188字节] A --> D[TS包3
188字节] A --> E[...] A --> F[TS包N
188字节] B --> B1[同步字节
0x47] B --> B2[包头
3字节] B --> B3[自适应字段
可选] B --> B4[负载
剩余字节] C --> C1[同步字节
0x47] C --> C2[包头
3字节] C --> C3[自适应字段
可选] C --> C4[负载
剩余字节] 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
188字节] A --> C[TS包2
188字节] A --> D[TS包3
188字节] A --> E[...] A --> F[TS包N
188字节] B --> B1[同步字节
0x47] B --> B2[包头
3字节] B --> B3[自适应字段
可选] B --> B4[负载
剩余字节] C --> C1[同步字节
0x47] C --> C2[包头
3字节] C --> C3[自适应字段
可选] C --> C4[负载
剩余字节] 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字节):
ini
位数 字段名称 说明
8位 同步字节 固定0x47
1位 传输错误指示符 0=无错误,1=有错误
1位 载荷单元起始指示符 0=中间包,1=起始包
1位 传输优先级 0=低优先级,1=高优先级
13位 PID 包标识符
2位 加扰控制 00=不加扰
2位 自适应字段控制 适应字段存在标志
4位 连续性计数器 防止丢包检测
PID分配表:
css
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(节目关联表):
ini
作用:列出所有节目及其PMT的PID
结构:
- 表ID: 0x00
- 节目号 -> PMT_PID映射
示例:
节目1 (program_number=1) -> PMT_PID=0x1000
节目2 (program_number=2) -> PMT_PID=0x2000
PMT(节目映射表):
ini
作用:列出节目中的所有基本流
结构:
- 表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错误恢复机制
同步恢复:
css
丢失同步情况:
[0x47][数据][XX][数据][0x47][数据]
↑
丢失同步字节
恢复方法:
1. 检测到非0x47字节
2. 向前搜索下一个0x47
3. 验证188字节后是否还是0x47
4. 确认后重新同步
连续性检查:
ini
正常序列:
包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
可变长] A3 --> A4[PES包2
可变长] A4 --> A5[...] end subgraph TS格式 B1[TS包1
188字节] --> B2[TS包2
188字节] B2 --> B3[TS包3
188字节] B3 --> B4[TS包4
188字节] B4 --> B5[...] end
可变长] A3 --> A4[PES包2
可变长] A4 --> A5[...] end subgraph TS格式 B1[TS包1
188字节] --> B2[TS包2
188字节] B2 --> B3[TS包3
188字节] B3 --> B4[TS包4
188字节] B4 --> B5[...] end
5.3 错误处理对比
PS格式错误传播:
css
错误场景:
[正常包][错误包][正常包][正常包]
↓
影响范围:整个PES包都可能受影响
后果:
- 可能导致整帧丢失
- 影响时间戳解析
- 播放卡顿或花屏
TS格式错误隔离:
css
错误场景:
[正常TS包][错误TS包][正常TS包][正常TS包]
↓
影响范围:仅188字节数据
恢复机制:
1. 错误检测(同步字节、CC计数器)
2. 错误隔离(固定包长)
3. 快速恢复(下个同步字节)
5.4 应用场景适配性
graph TD
A[应用场景] --> B[存储播放]
A --> C[网络传输]
A --> D[广播电视]
A --> E[流媒体]
B --> B1[PS格式✓
随机访问好
存储效率高] B --> B2[TS格式△
开销较大] C --> C1[PS格式✗
错误敏感
不适合传输] C --> C2[TS格式✓
容错能力强
实时性好] D --> D1[PS格式✗
无纠错机制] D --> D2[TS格式✓
专为广播设计] E --> E1[PS格式✗
缓冲要求高] E --> E2[TS格式✓
低延迟传输]
随机访问好
存储效率高] B --> B2[TS格式△
开销较大] C --> C1[PS格式✗
错误敏感
不适合传输] C --> C2[TS格式✓
容错能力强
实时性好] D --> D1[PS格式✗
无纠错机制] D --> D2[TS格式✓
专为广播设计] E --> E1[PS格式✗
缓冲要求高] E --> E2[TS格式✓
低延迟传输]
6. 实际应用场景
6.1 DVD/蓝光光盘
PS格式应用:
diff
DVD结构:
VIDEO_TS/
├── VIDEO_TS.IFO (导航信息)
├── VTS_01_0.IFO (标题信息)
├── VTS_01_1.VOB (PS格式视频文件)
├── VTS_01_2.VOB
└── ...
特点:
- 文件存储,无传输要求
- 需要快速跳转和随机访问
- 存储空间宝贵,要求高效率
技术细节:
diff
VOB文件格式:
- 基于PS格式
- 最大文件大小:1GB
- 支持多音轨、多字幕
- 包含导航信息
音视频规格:
- 视频:MPEG-2, 720×480/720×576
- 音频:AC-3, PCM, DTS
- 比特率:最高9.8Mbps
6.2 数字电视广播
TS格式应用:
diff
DVB-T/ATSC/ISDB-T广播系统:
天线接收 → 调谐器 → TS解复用 → 音视频解码 → 显示
传输特点:
- 无线传输,易受干扰
- 多个频道复用传输
- 需要实时播放
- 无重传机制
复用结构示例:
scss
一个6MHz频道可传输:
├── 高清频道1 (1920×1080, 15Mbps)
├── 标清频道2 (720×480, 3Mbps)
├── 标清频道3 (720×480, 3Mbps)
├── 数据服务 (1Mbps)
└── EPG信息 (0.5Mbps)
总计:22.5Mbps
6.3 IPTV系统
TS格式优势:
diff
IPTV传输链路:
节目源 → 编码 → TS封装 → IP封装 → 网络传输 → 机顶盒
网络传输特点:
- UDP/RTP传输
- 可能丢包、乱序
- 需要快速恢复
- 支持组播
QoS保证机制:
diff
网络层:
- 带宽预留
- 优先级队列
- 流量整形
应用层:
- FEC前向纠错
- 重传机制(unicast)
- 自适应码率
6.4 在线视频流
现代流媒体格式选择:
HLS (HTTP Live Streaming):
makefile
格式: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):
diff
格式:MP4片段 + MPD清单
优势:
- 更好的压缩效率
- 支持更多编码格式
- 更灵活的自适应机制
6.5 监控系统
格式选择考虑:
diff
实时监控:TS格式
- 低延迟要求(<500ms)
- 网络传输优化
- 支持多路流
录像存储:PS/MP4格式
- 存储效率优先
- 支持快速检索
- 兼容性要求
7. 其他常见封装格式
7.1 MP4格式
MP4特点:
diff
基础:ISO基础媒体文件格式
结构:原子(Atom/Box)层次结构
优势:
- 网络友好(支持渐进下载)
- 广泛兼容
- 支持多种编码
- 元数据丰富
MP4 vs PS/TS:
diff
MP4优势:
- 更现代的设计
- 更好的网络支持
- 更丰富的元数据
- 更灵活的结构
局限性:
- 较新格式,老设备可能不支持
- 结构复杂,解析开销大
7.2 其他格式简介
AVI格式:
特点:微软开发,结构简单
优势:兼容性好,支持多种编码
劣势:文件大小限制,功能有限
MKV格式:
objectivec
特点:开源容器,功能强大
优势:支持所有编码格式,功能丰富
劣势:兼容性不如MP4,文件较大
FLV格式:
特点:Adobe开发,Flash专用
优势:网络流媒体优化
现状:Flash退役,逐渐淘汰
8. 学习总结与建议
8.1 关键知识点总结
封装的核心价值:
- 多媒体同步:确保音视频协调播放
- 流管理:组织和标识多个数据流
- 错误处理:检测和恢复传输错误
- 随机访问:支持快进、快退操作
- 元数据管理:存储文件信息和播放参数
PS vs TS选择指南:
flowchart TD
A[选择封装格式] --> B{应用场景}
B -->|本地存储| C[PS格式]
B -->|网络传输| D[TS格式]
B -->|广播电视| D
B -->|流媒体| E[TS或现代格式]
C --> C1[优势:存储效率高
随机访问好] D --> D1[优势:容错能力强
实时性好] E --> E1[HLS: TS片段
DASH: MP4片段]
随机访问好] D --> D1[优势:容错能力强
实时性好] E --> E1[HLS: TS片段
DASH: MP4片段]
8.2 技术演进趋势
传统格式现状:
diff
PS格式:
- 仍用于DVD/蓝光
- 逐渐被MP4替代
- 新应用较少
TS格式:
- 广播电视标准
- HLS流媒体核心
- 继续广泛使用
新兴趋势:
diff
Web技术:
- WebM: VP9/AV1 + Opus
- 浏览器原生支持
- 开源无专利
云服务:
- 自适应流媒体
- 多格式自动转换
- CDN优化分发
8.3 学习建议
理论学习路径:
- 基础概念:理解封装vs编码区别
- 同步机制:掌握PTS/DTS概念
- 格式结构:了解PS/TS内部组织
- 应用场景:明确不同格式适用范围
实践练习建议:
工具使用:
bash
# 查看文件格式信息
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
分析练习:
markdown
1. 用hex编辑器查看TS文件同步字节
2. 分析不同格式的文件大小差异
3. 测试网络传输中的错误恢复
4. 比较不同格式的随机访问性能