HOME> 公会争霸> TS流的制作、传输及解析

TS流的制作、传输及解析

公会争霸 2025-11-30 13:11:05

解析PAT表的数据包

Analyze the Package of PAT

下图是用码流分析软件得到的PAT表的数据包。

可以将上图的的数据这样划分:

包头(Package Header)包数据(Package Data)

47 40 00 1C00 B0 1D 22 01 CF 00 00 00 00 E0 10 40 13 E1 30 40 18 E1 ... FF FF

注:表格内数据均为16进制数值。前4个字节为包头,后面的184个字节为包数据。

PAT表的包头

细分其表头(Package Header)数据(47 40 00 1C)如下:

位号012345

6789101112

13141516171819

20212223242526

2728293031...

Packet(二进制)

0100 0111

0100 0000

0000 0000

0001 1100

...

Packet(十六进制)

47

40

00

1C

...

Packet Header信息

0*: sync_byte=0x47

1*2*3*4*: PID (这里是0x0000)

5*6*

7*

...

拖动可显示更多数据

上表中,第一行为表头的位号(0-31,共32位),

第二行为每位的二进制数值,

第三行为每个字节的16进制数值,

最后一行的数据说明参看下面的表格。

Packet Header(包头)信息Demo

#标识位数说明

0*sync_byte8 bits固定是0x47

1*transport_error_indicator1 bits值为0,表示当前包没有发生传输错误。错误指示信息(1:该包至少有1bits传输错误)

2*payload_unit_start_indicator1 bits值为1,含义参考ISO13818-1标准文档。负载单元开始标志(packet不满188字节时需填充)

3*transport_priority1 bits值为0,表示当前包是低优先级。传输优先级标志(1:优先级高)

4*PID13 bitsPID=0x0000,说明是PAT表。Packet ID号码,唯一的号码对应不同的包

5*transport_scrambling_control2 bits值为0x00,表示节目没有加密。加密标志(00:未加密;其他表示已加密)

6*adaptation_field_control2 bits值为0x01,具体含义请参考ISO13818-1。附加区域控制

7*continuity_counter4 bits值为0xC,表示当前传送的相同类型的包是第12个。包递增计数器

PAT表的包数据总览

该包的数据部分(Package Data)为:

00 B0 1D 22 01 CF 00 00 00 00 E0 10 40 13 E1 30 40 18 E1 80 40 0A E0 A0 40 0E E0 B5 10 A5 84 FF ... FF FF

注意到这里有一个绿色的 00,

这是因为在包头后需要除去一个字节才是有效数据(payload_unit_start_indicator="1")。

因此,真正要分析的数据应该是红色部分:

B0 1D 22 01 CF 00 00 00 00 E0 10 40 13 E1 30 40 18 E1 80 40 0A E0 A0 40 0E E0 B5 10 A5 84 FF ... FF FF

解析前8个字节

下面对前8个字节(0-7字节,共计64 bits)进行分析:

B0 1D 22 01 CF 00 00 00 00 E0 10 40 13 E1 30 40 18 E1 80 40 0A E0 A0 40 0E E0 B5 10 A5 84 FF ... FF FF

位号

0123 4567

891011 12131415

16171819 20212223

24252627 28293031

32333435 36373839

40414243 44454647

48495051 52535455

...

Binary

0000 0000

1011 0000

0001 1101

0010 0010

0000 0001

1100 1111

0000 0000

...

Hex

00

B0

1D

22

01

CF

00

...

结构

0*: table_id=0x00

1*2*3*4*: section_length (这里是0x01D)

5*6*

7*8*9*10*

...

拖动可显示更多数据

#字段名占位具体值次序说明

0*table_id8 bits0000 0000(即0x00)第0个字节00PAT的table_id只能是0x00

1*section_syntax_indicator1 bit1第1、2个字节B0 1D段语法标志位,固定为1

2*zero1 bit0

3*reserved2 bits11 (Binary)

4*section_length12 bits00 00 00 01 11 01(即0x1D,十进制值为29)意思是 段长度为29字节

5*transport_stream_id16 bits‭00 10 00 10 00 00 00 01‬(即0x2201)第3、4个字节22 01TS的识别号

6*reserved2 bits11第5个字节CFTS的识别号

7*version_number5 bits0 01 11一旦PAT有变化,版本号加1

8*current_next_indicator1 bit1当前传送的PAT表可以使用,若为0则要等待下一个表

9*section_number4 bits00 00(即0x00)第6个字节00给出section号,在sub_table中,第一个section其section_number为"0x00",每增加一个section,section_number加一

10*last_section_number4 bits00 00(即0x00)第7个字节00sub_table中最后一个section的section_number

循环开始(循环内的数据解析见下一节内容!)

-program_number16 bits-----

-reserved3 bits-----

-network_id或program_map_PID13 bits----program_number为0x0000时,这里是network_id(NIT的PID);其余情况是program_map_PID(PMT的PID)

循环结束

-CRC_3232 bits--最后4个字节-

解析循环部分

下面对后续几个字节(第8个字符开始)进行分析:

B0 1D 22 01 CF 00 00 00 00 E0 10 40 13 E1 30 40 18 E1 80 40 0A E0 A0 40 0E E0 B5 10 A5 84 FF ... FF FF

在上一小节节的表格中,每一个循环都是4个字节(32 bits),我们在这里就先解析第一个循环:

B0 1D 22 01 CF 00 00 00 00 E0 10 40 13 E1 30 40 18 E1 80 40 0A E0 A0 40 0E E0 B5 10 A5 84 FF ... FF FF

位号

0123 4567

891011 12131415

16171819 20212223

24252627 28293031

...

Binary

0000 0000

0000 0000

1110 0000

0001 0000

...

Hex

00

00

E0

10

...

结构

1*: program_number = 0x0000

2*: reserved

3*: network_id = 0x10

...

拖动可显示更多数据

#字段名占位具体值说明

1*program_number16 bits0x0000program_number = 0x0000

2*reserved3 bits111-

3*program_map_PID13 bits0x0000因为program_number为0x0000,所以这里是network_id(NIT的PID)

继续解析下一个循环:

B0 1D 22 01 CF 00 00 00 00 E0 10 40 13 E1 30 40 18 E1 80 40 0A E0 A0 40 0E E0 B5 10 A5 84 FF ... FF FF

位号

0123 4567

891011 12131415

16171819 20212223

24252627 28293031

...

Binary

0100 0000

0001 0011

1110 0001

0011 0000

...

Hex

40

13

E1

30

...

结构

1*: program_number = 0x4013(即十进制16403)

2*: reserved

3*: program_map_PID = 0x130(即PMT_PID为0x130)

...

拖动可显示更多数据

#字段名占位具体值说明

1*program_number16 bits0x4013program_number = 0x4013(即十进制16403)

2*reserved3 bits111-

3*program_map_PID13 bits0x130因为program_number不为0x0000,所以这里是program_map_PID = 0x130(即PMT_PID为0x130)

通过这个循环,我们可以知道,在这个TS中,有一个节目号为0x4013(即十进制16403)的节目,其PMT的PID为0x130。那么要想获取这个节目的详细信息,就要去解析PID为0x130的PMT表。(关于PMT表的解析可参看下一节内容)

为了不占用过多空间来显示这样重复的内容,关于更多循环的分析就不显示在正文,如果你仍想看,可以 点击这里显示或隐藏。

继续解析下一个循环:

B0 1D 22 01 CF 00 00 00 00 E0 10 40 13 E1 30 40 18 E1 80 40 0A E0 A0 40 0E E0 B5 10 A5 84 FF ... FF FF

位号

0123 4567

891011 12131415

16171819 20212223

24252627 28293031

...

Binary

0100 0000

0001 1011

1110 0001

1000 0000

...

Hex

40

18

E1

80

...

结构

1*: program_number = 0x4018(即十进制16408)

2*: reserved

3*: program_map_PID = 0x180(即PMT_PID为0x180)

...

拖动可显示更多数据

#字段名占位具体值说明

1*program_number16 bits0x4018program_number = 0x4018(即十进制16408)

2*reserved3 bits111-

3*program_map_PID13 bits0x180因为program_number不为0x0000,所以这里是program_map_PID = 0x180(即PMT_PID为0x180)

通过这个循环,我们可以知道,在这个TS中,有一个节目号为0x4018(即十进制16408)的节目,其PMT的PID为0x180。那么要想获取这个节目的详细信息,就要去解析PID为0x180的PMT表。

循环汇总

将所有循环遍历完毕后,我们就能找出4个节目。下图是码流分析软件的截图。

PMT PID列表

下面表格是通过对PAT表分析后得到的数据。在分析完PMT表后,还可以对这张表进行补充,得到每个节目(Service)的名称。

#节目号PMT PID

1164030x130

2164080x180

3163940xA0

4163980xE0

PAT表包数据解析小结

对我们来说,PAT就是一个总入口。PAT告诉了我们,这个TS流中有几个节目,以及它们的PMT PID分别是多少。有了PMT的PID,我们就可以继续下一步了。

匈奴、突厥、契丹、蒙古、满族等少数民族的相貌到底如何?
Python基础语法----函数参数和返回值