最近开始学习数字电视机顶盒的开发,从MPEG-2到DVB,看着看着突然就出现了一大堆表格,什么PAT、PMT、CAT……如此多的表该怎样深入了解呢?
我们知道,数字电视机顶盒接收到的是一段段的码流,我们称之为TS(Transport Stream,传输流),每个TS流都携带一些信息,如Video、Audio以及我们需要学习的PAT、PMT等信息。因此,我们首先需要了解TS流是什么,以及TS流是怎样形成、有着怎样的结构。
ES流(Elementary Stream):基本码流,不分段的音频、视频或其他信息的连续码流。
PES流:把基本流ES分割成段,并加上相应头文件打包成形的打包基本码流。
PS流(Program Stream):节目流,将具有共同时间基准的一个或多个PES组合(复合)而成的单一数据流(用于播放或编辑系统,如m2p)。
TS流(Transport Stream):传输流,将具有共同时间基准或独立时间基准的一个或多个PES组合(复合)而成的单一数据流(用于数据传输)。
(二)
TS流是如何产生的?Packet Header(包头)信息说明 | |||
1 | sync_byte | 8bits | 同步字节 |
2 | transport_error_indicator | 1bit | 错误指示信息(1:该包至少有1bits传输错误) |
3 | payload_unit_start_indicator | 1bit | 负载单元开始标志(packet不满188字节时需填充) |
4 | transport_priority | 1bit | 传输优先级标志(1:优先级高) |
5 | PID | 13bits | Packet ID号码,唯一的号码对应不同的包 |
6 | transport_scrambling_control | 2bits | 加密标志(00:未加密;其他表示已加密) |
7 | adaptation_field_control | 2bits | 附加区域控制 |
8 | continuity_counter | 4bits | 包递增计数器 |
PID是TS流中唯一识别标志,Packet Data是什么内容就是由PID决定的。如果一个TS流中的一个Packet的Packet Header中的PID是0x0000,那么这个Packet的Packet Data就是DVB的PAT表而非其他类型数据(如Video、Audio或其他业务信息)。下表给出了一些表的PID值,这些值是固定的,不允许用于更改。
表 | PID 值 |
PAT | 0x0000 |
CAT | 0x0001 |
TSDT | 0x0002 |
EIT,ST | 0x0012 |
RST,ST | 0x0013 |
TDT,TOT,ST | 0x0014 |
下面以一个TS流的其中一个Packet中的Packet Header为例进行说明:
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | … | |
Packet(十六进制) | 4 | 7 | 0 | 7 | e | 5 | 1 | 2 | … | ||||||||||||||||||||||||
Packet(二进制) | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | … |
Packet Header 信息 | 1 sync_byte=0x47 | 2 | 3 | 4 | 5 PID=0x07e5 | 6 | 7 | 8 | … |
sync_byte=01000111, 就是0x47,这是DVB TS规定的同步字节,固定是0x47.transport_error_indicator=0, 表示当前包没有发生传输错误.payload_unit_start_indicator=0, 含义参考ISO13818-1标准文档transport_priority=0, 表示当前包是低优先级.PID=00111 11100101即0x07e5, Video PIDtransport_scrambling_control=00, 表示节目没有加密adaptation_field_control=01 即0x01,具体含义请参考ISO13818-1continuity_counte=0010 即0x02,表示当前传送的相同类型的包是第3个
TS流的基本内容就是这些了。
回顾一下,TS流是一种位流(当然就是数字的),它是由ES流分割成PES后复用而成的;它经过网络传输被机顶盒接收到;数字电视机顶盒接收到TS流后将解析TS流。
TS流是由一个个Packet(包)构成的,每个包都是由Packet Header(包头)和Packet Data(包数据)组成的。其中Packet Header指示了该Packet是什么属性的,并给出了该Packet Data的数据的唯一网络标识符PID。
到这里,我们对TS流已经有了一定的了解,下面将从TS流转向PAT表和PMT表的学习。
二、从TS流到PAT、PMT说完了TS流的基本概念,就该开始对TS流进行更深入的研究了。首先需要想一想:TS流的本质是什么?它的确是一段码流,并且是一段由数据包(Packet)组成的码流。那么这些数据包究竟是怎样的呢?它和我们收看的电视节目之间又有什么区别?这些都是这部分需要了解的内容。
在上一节中,我们可以看到PID这个被标红的字段频繁地出现。PID是当前TS流的Packet区别于其他Packet类型的唯一识别符,通过读取每个包的Packet Header,我们可以知道这个Packet的数据属于何种类型。上一节列出了几项固定的PID值,它们用于识别存储了特殊信息的Packet。下面要谈的PAT表的PID值就是固定的0x0000。
(一)
PAT表(Program Association Table,节目关联表)TS流ID | transport_stream_id | 该ID标志唯一的流ID |
节目频道号 | program_number | 该号码标志TS流中的一个频道,该频道可以包含很多的节目(即可以包含多个Video PID和Audio PID) |
PMT的PID | program_map_PID | 表示本频道使用哪个PID做为PMT的PID,因为可以有很多的频道,因此DVB规定PMT的PID可以由用户自己定义 |
Packet Header | Packet Data |
0x47 0x40 0x00 0x10 | 0000 b0 11 00 01 c1 00 00 00 00 e0 1f 00 01 e1 00 24 ac48 84 ff ff…… ff ff |
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | … | |
Packet(十六进制) | 4 | 7 | 4 | 0 | 0 | 0 | 1 | 0 | … | ||||||||||||||||||||||||
Packet(二进制) | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | … |
Packet Header Bits | 1 sync_byte=0x47 | 2 | 3 | 4 | 5 PID=0x0000 | 6 | 7 | 8 | … |
sync_byte | 0x47 | 固定同步字节 |
transport_error_indicator | “0” | 没有传输错误 |
payload_unit_start_indicator | “1” | 在前4个字节后会有一个调整字节。所以实际数据应该为去除第一个字节后的数据。即上面数据中红色部分不属于有效数据包。 |
transport_priority | “0” | 传输优先级低 |
PID | 0x0000 | PID=0x0000说明数据包是PAT表信息 |
transport_scrambling_control | “00” | 未加密 |
adaptation_field_control | “01” | 附加区域控制 |
continuity_counte | “0000” | 包递增计数器 |
Packet Data分析 | |||||||||||||||||||||||||
第n个字节 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | … | ||||
Packet Data(除去开头的0x00) | 00 | b0 | 11 | 00 | 01 | c1 | 00 | 00 | 00 | 00 | e0 | 1f | 00 | 01 | e1 | 00 | 24 | ac | 48 | 84 | … | ||||
字段名 | 位 | 具体值 | 次序 | 说明 | |||||||||||||||||||||
table_id | 8 | 0000 | 第1个字节 0000 0000B(0x00) | PAT的table_id只能是0x00 | |||||||||||||||||||||
section_syntax_indicator | 1 | 1 | 第2、3个字节 1011 0000 0001 0001B(0xb0 11) | 段语法标志位,固定为1 | |||||||||||||||||||||
zero | 1 | 0 | |||||||||||||||||||||||
reserved | 2 | 11 | |||||||||||||||||||||||
section_length | 12 | 0000 0001 0001B=0x011=17 | 段长度为17字节 | ||||||||||||||||||||||
transport_stream_id | 16 | 0x0001 | 第4、5个字节 0x00 0x01 | ||||||||||||||||||||||
reserved | 2 | 11 | 第6个字节 1100 0001B(0xc1) | ||||||||||||||||||||||
version_number | 5 | 00000 | 一旦PAT有变化,版本号加1 | ||||||||||||||||||||||
current_next_indicator | 1 | 1 | 当前传送的PAT表可以使用,若为0则要等待下一个表 | ||||||||||||||||||||||
section_number | 8 | 0x00 | 第7个字节0x00 | ||||||||||||||||||||||
last_section_number | 8 | 0x00 | 第8个字节 0x00 | ||||||||||||||||||||||
开始循环 | |||||||||||||||||||||||||
program_number | 16 | 0x0000-第一次 | 2个字节(0x00 00) | 节目号 | |||||||||||||||||||||
reserved | 3 | 111 | 2个字节 1110 0000 0001 1111B(0xe0 1f) | ||||||||||||||||||||||
network_id(节目号为0时) program_map_PID(节目号为其他时) | 13 | 0 0000 0001 1111B=31 -第一次 | 节目号为0x0000时,表示这是NIT,PID=0x001f,即31 节目号为0x0001时,表示这是PMT,PID=0x100,即256 | ||||||||||||||||||||||
结束循环 | |||||||||||||||||||||||||
CRC_32 | 32 | -- | 4个字节 |
欢迎光临 SuperIC社区_ (/) | Powered by Discuz! X3.3 |