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