MPEG2-TS 结构体
mpeg-ts使用了3层封装(ES > PES > TS)数据。通常我们看到的文件都是若干个 188个以 0x47开头的 ts packet 组成的。如果我们需要拆包es 需要从上到下逐层拆包结构。如果需要封包则刚好相反。
TS
每个 ts packet 由188个字节组成, 这些字节通常为3部分,文件头,适配字段(可能不存在),载荷。因为ts是对pes数据进行封装。通常来说pes的数据肯定是大于188的,这样就有多个ts packet 来进行包含pes数据。
TS Header
4个字节 32位数据包含了8个字段
示例数据 47 41 00 30
01000111 01000001 00000000 00110000
01000111 0 1 0 0000100000000 00 11 0000
字节 | 位数 | 描述 |
---|---|---|
1 | 8 | 固定的数据0x47 |
2 | 1 | 发送时(调制前)值为0。接收方的解调器在无法成功解调(即使有前向纠错机制)TS分组内容时,将该位设置为1,表示该TS分组损坏 |
1 | 负载单元起始标示符,一个完整的数据包开始时标记为1, 表示携带的是PSI或PES第一个包 | |
1 | 值为1时,在相同PID的分组中具有更高的优先权。 | |
2,3 | 13 | PID用于识别TS分组的ID。一个PID对应一种特定的PSI消息或者一个特定的PES。 |
4 | 2 | 值为'00'时表示载荷未加密。其余值由具体系统定义。 |
2 | 适配域表示 '00' = 保留 (供未来使用) '01' = 无适配域,仅有载荷 '10' = 仅有适配域 '11' = 适配域和载荷都存在 | |
4 | 取值为0x00到0x0F,循环。用于检查同一个PID的TS分组的连续性。每当一个TS分组中包含载荷时,该计数器加1。 |
TS Adaptation (可以不存在)
这个结构体只有在 ts header 适配域 位
10
11
时候存在。
所属字节 | 位数 | 描述 |
---|---|---|
1 | 8 | 适配域长度 不包括当前字节 |
2 | 1 | 不连续指示位 |
2 | 1 | 如果当前分组是一个PES的起始,取值为1。 |
2 | 1 | 取值为1时ES优先级更高。 |
2 | 1 | 1表示适配域中有PCR域 |
2 | 1 | 1表示适配域中有OPCR域 |
2 | 1 | 1表示适配域中有接续倒数计数器域 |
2 | 1 | 1表示适配域中有私有数据域 |
2 | 1 | 1表示适配域中有适配域扩展域 |
TS Payload (可以不存在)
这个结构体只有在 ts header 适配域 位
01
11
时候存在。
188 去掉头字段则为载荷
PES
所属字节 | 位数 | 描述 |
---|---|---|
1,2,3 | 32 | 0x000001 文件头 |
4 | 8 | Audio streams (0xC0-0xDF), Video streams (0xE0-0xEF) |
5,6 | 16 | PES Header标志 (标志详情见下 PES Header描述) |
7 | 8 | PES header 长度 |
7 | 8 | PES header 总长度 |
PES Header
https://dvd.sourceforge.net/dvdinfo/pes-hdr.html
字段名称 | 位数 | 描述 |
---|---|---|
标记位 (Marker bits) | 2 | 值为 二进制10 |
加扰控制 (Scrambling control) | 2 | 00 表示未加扰 |
优先级 (Priority) | 1 | |
数据对齐指示 (Data alignment indicator) | 1 | 1 表示 PES 包头紧接着是视频起始码或音频同步字 |
版权 (Copyright) | 1 | 1 表示有版权 |
原始或副本 (Original or Copy) | 1 | 1 表示原始数据 |
PTS DTS 指示符 (PTS DTS indicator) | 2 | 11 = 同时存在 PTS 和 DTS,01 是禁止的,10 = 仅有 PTS,00 = 无 PTS 或 DTS |
ESCR 标志 (ESCR flag) | 1 | |
ES 速率标志 (ES rate flag) | 1 | |
DSM 技巧模式标志 (DSM trick mode flag) | 1 | |
附加复制信息标志 (Additional copy info flag) | 1 | |
CRC 标志 (CRC flag) | 1 | |
扩展标志 (extension flag) | 1 |