TS协议解析第三部分(PES)

1. PES:

1.1 PES介绍:

PES--Packetized  Elementary Streams  (分组的ES),ES形成的分组称为PES分组,是用来传递ES的一种数据结构。PES流是ES流经过PES打包器处理后形成的数据流,在这个过程中完成了将ES流分组、打包、加入包头信息等操作(对ES流的第一次打包)。PES流的基本单位是PES包。PES包由包头和payload组成

1.2. PES句法句法示意图:


2. 分析PES包:

2.1 PES包数据:


2.2 包头:

TS包头只有4个字节(47 48 14 10),除掉第一个字节0x47,剩下就3个,重新分组如下:

0    1    0  0100000010100    00    01    0000

sync_byte

同步字节 

0x47:

transport_error_indicator

传输错误标识

0:

payload_unit_start_indicator

负载单元开始标识

1:可知这个包的负载部分有PES爆头,换句话说,也就是帧头所在。又由第二个TS包的分析可知,PID为814的TS包,存放的都是MP3格式的数据。可知这个包存储了MP3格式的一帧部分数据。

transport_priority

传输优先级

0:

pid

PID

0x814:因为在PMT中查找音频是program_map_PID为0x814。

transport_scrambling_control

传输扰乱控制

00:

adaptation_field_control

自适应区域控制

01:可知负载只含有有效载荷单元,也就是PES包。而不含自适应字段。

00是保留值。
01负载中只有有效载荷。
10负载中只有自适应字段。
11先有自适应字段,再有有效载荷。

continuity_counter

连续计数器

0x0:0000 0000 00000000

2.3 TS包:
1) 00 00 01:包起始码前缀。默认规定。占24位,3个字节。(47 48 14 1000 00 01 C0 01 88 80 80 05 21 00 01 96 07 FF FD 85 00 33 22

2) C0:1100 0000:流ID,占8位47 48 14 10 00 00 01 C0 01 88 80 80 05 21 00 01 96 07 FF FD 85 00 33 22
3)01 88:0000 0001 1000 1000 PES包长度,也就是一帧数据的总长度(也就是这帧长度是392字节)。47 48 14 10 00 00 01 C0 01 88 80 80 05 21 00 01 96 07 FF FD 85 00 33 22

4)80:1000 000047 48 14 10 00 00 01 C0 01 88 80 80 05 21 00 01 96 07 FF FD 85 00 33 22
10:默认规定
00:PES加扰控制
0:PES优先级
0:数据定位指示符
0:版权
0:原始的或复制的

5)80:1000 000047 48 14 10 00 00 01 C0 01 88 8080 05 21 00 01 96 07 FF FD 85 00 33 22
10:PTS_DTS_flags,10代表后面将会有PTS信息。
000000:分别代表其他6个标志,0表示后面没有对应的信息。

6)05:0000 010147 48 14 10 00 00 01 C0 01 88 80 80 05 21 00 01 96 07 FF FD 85 00 33 22
PES头数据长度,表示后面还有0x05个字节,之后就是一帧的数据内容。
PES头数据具体包含哪些内容有前面的标志位来确定,哪些信息得标志位1,就包含哪些信息。排列顺序分别是PTS DTS ESCR ES速率 DSM特技方式 附件的复制信息 前PES的CRC PES 扩展,如果还有多余的字节没用,就用填充字节0xFF填充。
本例子中,PES头数据只包含PTS数据。

7)21 00 01 96 07:5个字节总共40位47 48 14 10 00 00 01 C0 01 88 80 80 05 21 00 01 96 07 FF FD 85 00 33 22

If(PTS_DTS_flags == ‘10’){

           

‘0010’

4

PTS[32..30]

3

marker_bit

1

PTS[29..15]

15

marker_bit

1

PTS[14..0]

15

marker_bit

1

}

 


0010:默认规定,4位
000:PTS[32..30] 3位
1:marker_bit:1位
0000 0000 0000 000:PTS[29..15] 15位
1:market_bit 占1位
1001 0110 0000 011:PTS[14..0] 15位
1:marker_bit 1位
PES,包头分析完。剩下的数据就全是帧数据的一部分数据了。
8)FF FD 85 00 33 2247 48 14 10 00 00 01 C0 01 88 80 80 05 21 00 01 96 07 FF FD 85 00 33 22)这些数据符号MP3格式。

packet_start_code_prefix

0x00 00 01

stream_id

0xC0:流ID

PES_packet_length

0x01 88:PES包长度

‘10’

2b:10

PES_scrambling_control

2b:0

PES_priority

1b:0

Data_alignment_indicator

1b:0

copyright

1b:0

Original_or_copy

1b:0

PTS_DTS_flags

2b:10

ESCR_flag

1b:0

ES_rate_flag

1b:0

DSM_trick_mode_flag

1b:0

Additional_copy_info_flag

1b:0

PES_CRC_flag

1b:0

PES_extension_flag

1b:0

PES_header_data_length

8b:0x05

PTS_DTS data

40b:0x21 00 01 96 07


3. PES第二个数据包:

3.1 PES包数据:


3.2 包头:

S包头只有4个字节(47 08 14 11),除掉第一个字节0x47,剩下就3个,重新分组如下:

0    0    0  0100000010100    00    01    0001

sync_byte

同步字节

0x47:

transport_error_indicator

传输错误标识

0:

payload_unit_start_indicator

负载单元开始标识

0:有效载荷单元起始符为0,表示不是帧头,不含PES包头数据,只有PES负载(PES负载就是一帧数据)

transport_priority

传输优先级

0:

pid

PID

0x814:因为在PMT中查找音频是program_map_PID为0x814。

transport_scrambling_control

传输扰乱控制

00:

adaptation_field_control

自适应区域控制

01:可知负载只含有有效载荷单元,也就是PES包。而不含自适应字段。

00是保留值。
01负载中只有有效载荷。
10负载中只有自适应字段。
11先有自适应字段,再有有效载荷。

continuity_counter

连续计数器

0x0001:0000 0000 00000001


3.3 TS数据:

去除包头都是MP3数据的有效荷载。

4. PES语法解析:






版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013354805/article/details/51591229
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页