TS流的结构
TS流由很多个TS包组成,而每个TS包的结构包括:4B的包头,可变长的调整字段,有效净荷(payload)。现在分别说一下这三部分的结构和作用。
-
包头
包头最小为4字节,这四字节分为8个部分分别为:8bit的同步字节,1bit的传送数据包差错指示,1bit的净荷单元起始指示,1bit的传送优先级,13bit的PID,2bit的传送干扰控制,2bit的适应域控制,4bit的连续计数器。这8个部分具体的作用是:
同步字节:Sync byte,8位。这是包的标识符,值是固定的为0X47。它的作用就是用来判断是否为一个包。
传输数据包差错指示:transport_error_indicator, 1位。因为只有一位所以只可能有两种情况0和1。为1时表示传送包中有错误的位。当为0时表示传送包中没有错误或者错误已经被纠正。
净荷单元开始指示:payload_unit_start_indicator, 1位。也只有两种情况,这个字段用来表示TS包的有效净荷带有PES包或PSI的情况。
当TS包中的净荷为PES包数据时:该位为1时,表示该TS包的有效净荷PES包的第一个字节开始;为0时,表示TS包的开始不是PES包。
当TS包中的净荷为PSI数据时:该位为1时,表示TS包中带有PSI中的第一个字节,为0时,表示不到有PSI部分的第一个字节。
如果这个包是空包,该位为0.
传输优先级:transport_priority,1位。为1时表示该包的优先级比相关具有相同PID的包的优先级要高。
PID:这个有13位,用来判断有效净荷中的数据类型。其中可能的数据类型为PSI/SI表或者音视频数据即PES包。PSI/SI表中有一些表的PID是固定不变的,其中PAT(节目关联表)的PID为0X0000,CAT(条件访问表)的PID为0X0001.
0X0003-0X000F为保留。NIT(网络信息表)的PID为0X0010.还有一些PID为SI中的表,音视频PES包,PMT(节目映射表)等。最后空包的PID为0X1FFF即8191为固定的。
传输干扰控制:transport_scrambling_control, 2位。作用是用来表示传送流包有效净荷的加扰方式。
适应域控制:adaptation_field_control. 2位。作用是用来指示传输流首部是否跟随有调整字段或有效净荷。为00时表示保留;为01时表示没有调整字段,有效净荷长度为184B;为10时表示没有有效净荷,仅仅含有183B长度的调整字段;为11时表示有调整字段和有效净荷。
连续计数器:continuity_counter, 4位。它随着PID相同的TS包的增加而增加。但是当适应域控制位为“00”或者“10”时,连续计数器是不增加的。
-
可变长的调整字段
调整字段包括对较高层次的解码功能有用的相关信息,组成为8bit的调整字段长度,1bit不连续指示器,1bit随机存取指示器,PCR标识符,基本优先级指示器,拼接点标识符,传送专用数据标识,调整字段扩展标识和相应标识符。
-
有效净荷
在有效净荷中包括两类的信息:已经被压缩的音视频信息和与之相关的符号化表。这些符号化的表有PSI(节目专用信息表)和SI(业务信息表),这些表以分段的形式传送。
PSI包括PAT(节目关联表),PMT(节目映射表),CAT(条件访问表),NIT(网络信息表)。但是NIT是可选的。
先说说PAT表:
找PAT表:每一个TS流只有一个一个PAT表,要查找节目信息必须从PAT表开始,然而要找到PAT表必须先提取出TS包头的PID,看看PID是否为0X0000,应为PAT表的PID固定为0X0000。
PAT表中的信息:PAT中储存的是节目号和对应节目的PMT表的PID。其中如果节目号为0,则对应的PID为NIT表的PID。
PAT表的语法结构:
PAT表可以分为很多个段,其中每个段的语法结构是一样的,PAT表格的整体字头为固定的8B。
PAT段的数据结构:
Program_association_section()
{
Table_id 8
Section_syntax_indicator 1
‘0’ 1
Reserved 2
Section_length 12
Transport_stream_id 16
Reserved 2
Version_number 8
Current_next_indicator 1
Last_section_number 8
For(i=0;i<N;i++)
{
Program_number 16
Reserved 3
If(program_number== ‘0’)
{
Network_id 13
}
Else
{
Program_map_PID 13
}
}
CRC_32 32
}
Table_id : 8bit 这个是固定的为0X0. 它可以区分这个段是PAT段,CAT段还是PMT段。
Section_syntax_indocator: 1bit 对于PAT置为0X1.
Section_length: 12bit 这个字段指示分段的字节数,由当前字段到CRC。用这个可以计算出节目的个数。该字段的值不能超过1021.
Transport_stream_id: 16bit 这个表示传输流的标识符。用来区别于其他的传输流。
Version_number: 5bit PAT的版本号
Current_next_indicator: 1 bit 为1时表示传送的PAT当前可以使用。为0时表示传送的表不能使用下一个表变为有效。
Section_number: 1B 表示段号。
Last_section_number: 1B 为最后一个段号,即段的数量。
Program_number: 2B 表示节目号,如果为0则后面的PID为NIT的PID。
Network_id :13bit NIT的PID。
Program_map_PID: 13bit 对应节目的PID。
CRC: 32bit 为校验码。
PMT:
PMT表包含了与单路节目复用有关的控制信息,PMT典型的构成包括一路视频打包的基本码流,多路音频码流和辅助数据。每一路的PES被分配了唯一的PID。PMT表格的整体字头为12B。数据结构与PAT表相似,但是table_id是不一样的固定为0X2,以区别于其他的表。其中PMT特有的字段有:
Stream_type: 8bit 用来描述PES流的类型,类型有视频,音频,私有数据和私有段等。
CAT:
条件访问表提供了在一个或多个CA系统的授权管理信息或者访问控制信息,给出了有条件接受系统的信息及EMM的传送位置,音视频数据使用的加密方法信息,为加扰系统携带控制信息的PID条目。CAT的数据结构和其他的表区别不大,只是在CA_descriptor()上有区别。
NIT:
一个数字电视系统只对应两个NIT表,及当前网络表(Table_id为0X40)和其他网络表(table_id为0x41)。
NIT表主要是提供有关物理网络的信息,每个网络都有唯一的识别符,网络信息主要携带网络识别符,网络名称,传输系统参数(频率,调制方式,FEC外码,符号率,FEC内码)。每个运营商都要注册唯一的一个network_id.NIT中特有的字段:
Network_id: 16bit 充当一个标号,每一个运营商都有自己的network_id。
Original_network_id: 16bit 用来标识原始传输系统的network_id。
SI包括BAT(业务关联表),SDT(业务描述表),EIT(事件信息表),RST(运行状态表),TDT(时间日期表),TOT(时间偏移表),ST(填充表),SIT(选择信息表),DIT(间断信息表)。这里介绍BAT,SDT和EIT。
BAT:
BAT提供了所涉及的有关节目业务组的信息,包括节目业务组名称及节目业务组所包含的节目业务清单。BAT的PID固定为0X0011,table_id为0X4A。BAT数据结构中特有的字段:
Bouquet_id: 16bit 它充当一个标号来标识业务组。
EIT:
EIT表用于传送与在特殊MPEG复用中出现或将要出现的所有节目段相关的信息。EIT表分为4类,由不同的table_id来区别。EIT表可以分为很多个段,但是每个段都必须由PID值为0x0012的TS包传送。EIT数据结构中特有的字段:
Service_id: 16bit 作用是在一个TS内从任何其他业务中标识这个业务。与对应的PMT表中的program_id相同。
Event_id: 16bit 包含了所描述的节目段的标号在一个业务内是唯一的。
Start_time: 40 bit 包含了节目段的起始时间。
Duration: 24bit 包含时分秒的信息,按4bitBCD码编码。
Runing_status: 3bit 表示节目段的状态。
Free_CA_mode: 1bit 置0时,表示节目段的所有的成分流没有加扰,为1时表示由一个CA系统控制访问一个或多个流。
SDT:
SDT表PID固定为0X0011,SDT提供了节目的节目业务组,节目业务的类型(PLA,NTSC,SECAM等),指向特定信息的链接信息,实现多画面的控制信息等。重要的是节目名称也包含在SDT中。描述现行TS的SDT表的任何段的table_id应为0x42,而且具有相同的transport_stream_id)以及相同original_network_id。指向一个现行TS之外的其他TS的SDT表的任何段的table_id应为0x46.