TS流的制作、传输及解析
解析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 bits00 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,我们就可以继续下一步了。