天天看點

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句法句法示意圖:

  1. 分析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 0000(47 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 0000(47 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 0101(47 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 22:(47 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

  1. 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

  1. PES文法解析: