音视频学习3-视频封装

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

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

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


目录

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

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]

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

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

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[其他可选字段]

流ID分配:

scss 复制代码
视频流: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
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

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格式✓
低延迟传输]

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 关键知识点总结

封装的核心价值:

  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[优势:存储效率高
随机访问好] 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 学习建议

理论学习路径:

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

实践练习建议:

工具使用:

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. 比较不同格式的随机访问性能
相关推荐
百度Geek说1 天前
播放器视频后处理实践(一)
音视频开发
音视频牛哥2 天前
从 H.264/H.265 到 H.266:RTSP播放器的跨代际演进
音视频开发·视频编码·直播
GitLqr3 天前
AI洞察 | 混元、昆仑 重塑 3D 世界新方向
计算机视觉·游戏开发·音视频开发
哔哩哔哩技术3 天前
B站第三代转码体系下流式转码测试实践
音视频开发
音视频牛哥4 天前
从「行走」到「思考」:机器人进化之路与感知—决策链路的工程化实践
机器学习·机器人·音视频开发
chenchao_shenzhen7 天前
RK3568嵌入式音视频硬件编解码4K 60帧 rkmpp FFmpeg7.1 音视频开发
ffmpeg·音视频·rk3588·音视频开发·嵌入式开发·瑞芯微rk3568·硬件编解码
码流怪侠9 天前
Google SoundStream音频编解码器技术解析
深度学习·音视频开发
字节跳动视频云技术团队10 天前
基于 DiT 大模型与字体级分割的视频字幕无痕擦除方案,助力短剧出海
aigc·音视频开发·视频编码