下面的字节是从ts文件中读取的一个ts包。并包含有PES头。

负载单元开始标志 附加区域控制 知道。

负载单元开始标志:第二个字节的第二位知道: 负载单元开始标志,1:含有PES数据时,该包为其开始。

附加区域控制:第四个字节,第3、4位  附加区域控制,后面是否有自适应字段和有效载荷 

47 40 45 30 07 10 87 14 3E 61 FE 00 00 00 01  E0 35 93  80 C0  0A 39  38 A7  06 75 19  38 A7 06 

75 00 00 00 01 09 10 00 00 00 01 67 4D 40 29 E9 80 A0 0B 76 02 20 00 01 F4 80 00 EA 9C 13 

E3 86 27 00 00 00 01 68 FE 32 48 00 00 00 01 06 00 01 C0 80 00 00 00 01 06 01 01 04 80 00 

00 00 01 41 88 80 10 6F F3 83 62 ED 5F 32 BE 03 FF 74 45 7C A3 FE 0F 76 3C A8 BE 65 8A BD 

CC 00 00 03 00 00 03 00 00 03 00 00 03 00 0D 75 34 BA 90 F1 6E D2 E3 F4 00 00 03 00 00 03 

00 76 00 01 0C 00 3B E5 09 40 85 3F 56 42 87 23 D5 14 2B 4A A7 7C 39 5C 15 A6 A6 A2 D0 C3 

BC 24 98 96 27 27 13 B0 

47 40 45 30 07 10 87 14 3E 61 FE 00 TS包头及自适应字段

00 00 01 E0 这四个四节叫做PES包的开始字节

E0   二进制 1110 0000 流类型 : H264  ISO/IEC 13818-3  或 ISO/IEC 11172-3  或 ISO/IEC 13818-7  或 ISO/IEC 14496-3  音 频流编号 x xxxx  

35 93  PES长度 0x 35 0x93 = 13715个字节,这说明这个PES包的长度是13715,需要好些ts包才能分割完。

80  = 10 00 0 0 0 0 =   10(固定值) 00PES_scrambling_control 0PES_priority 0 data_alignment_indicator  0copyright  0original_or_copy 

data_alignment_indicator  :0  包头后没有填充

C0 11 PTS_DTS_flags   0 ESCR_flag  0 ES_rate_flag 0 DSM_trick_mode_flag  0 additional_copy_info_flag  0 PES_CRC_flag  0 PES_extension_flag 说明既有PTS又有DTS

0A  PES_header_data_length 10字节,由任选字节(也就是下面的扩展域)和任意填充字节构成的长度。


39 = 0011 1001 = 0011(固定值)100(PTS[32-30]) 1 标记位,赋值1

38 A7 = 00 11 1000 1010 0111 = 111000101001(PTS[29-15])1 标记位 赋值1 意义不明

06 75 =  0000 0 110 0111 0101 =  0000 0110 0111 010(PTS[14-0]) 1 标记位 赋值1 PTS = 4532568890

19  =  000 1 1001  = 0001(固定值)100(TDS[32-30])1 标记位,赋值1 100 0011 1000 1010 0110000  0110 0111 010

38 A7 = 00 11 1000 1010 0111 = 0011 1000 1010 011(TDS[29-15])1 标记位,赋值1

06 75 = 0000  0 110 0111 0101 = 0000  0110 0111 010(TDS[14-0]) 1 标记位,赋值1 DTS = 4532568890

19 38 A7 06 75 这几个应该是任意填充字节。


负载的是h264视频数据,这是从节目映射表PMT中知道的。


附,

1. Wiki 对PES包头的定义

​https://en.wikipedia.org/wiki/Packetized_elementary_stream​​      


2. 图解


3. PES中扩展头部的判断

根据流类型判断(流类型是PES包头第四字节),扩展头部有三种。

一种是非 (0xBC 0XBE  0xBF 0xF0 0xF1 0xF2 0xF8),这类可能又PTS/DTS信息

一种是(0xBC  0xBF 0xF0 0xF1 0xF2 0xF8)其中之一。

一种是 0XBE,也就是padding_stream 。

第一种

1011 1100  1  program_stream_map     0xBC

1011 1110  padding_stream                  0XBE

1011 1111  3  private_stream_2              0xBF

1111 0000  3  ECM_stream                     0xF0

1111 0001  3  EMM_stream                    0xF1

1111 1111  4  program_stream_directory 0xFF

1111 0010  5  ITU-T H.222.0 建议书 | ISO/IEC 13818-1  附件 A 或 ISO/IEC 13818-6_DSMCC_stream 0xF2

1111 1000  6  ITU-T H.222.1  建议书类型 E 0xF8


第二种:

  1011 1100  1  program_stream_map     0xBC

1011 1111  3  private_stream_2              0xBF

1111 0000  3  ECM_stream                     0xF0

1111 0001  3  EMM_stream                    0xF1

1111 1111  4  program_stream_directory 0xFF

1111 0010  5  ITU-T H.222.0 建议书 | ISO/IEC 13818-1  附件 A 或 ISO/IEC 13818-6_DSMCC_stream 0xF2

1111 1000  6  ITU-T H.222.1  建议书类型 E 0xF8

第三种

1011 1110  padding_stream                  0XBE