目录
什么是PSI
在mpeg-2的传输流(Transport Stream)中,PSI是(Program Specific Information) 节目专用信息的简称,是对单一码流的描述,PSI信息由四种类型表组成。每类表按段传输。分别是:PAT,CAT,PMT,NIT。
什么是SI
在DVB系统中,中SI是(Service Information)业务信息的简称,是对系统中所有码流的描述,用于描述传送系统、内容和广播数据流的计划/时间表等的数据。它包括MPEG-2的PSI信息及独立定义的扩展部分。扩展部分由9个表组成:BAT SDT EIT RST TDT TOT ST SIT DIT。
什么是MPEG和MPEG-2
MPEG是Moving Picture Experts Group 的简称,MPEG-2是MPEG和ISO组织设计的一个数字视频压缩规范,主要用于DVD和DVB上,当前的标准文档是ISO13818.
什么是DVB
DVB是Digtal Video Broadcast的简称,是欧洲所有国家和其他部分国家和地区使用的数字电视标准.其中美国的ATSC标准也是在DVB标准的基础上实现的.
什么是TS码流和PS流
TS是transport stream的简称,就是“传输流”.DVB数据广播采用的数据格式就是TS码流。视频、音频、图片、文字等处理后成为数据,以MPEG-2标准打包成为固定长度(188字节)的传送包(TS包),并将这些包复用形成传输流(TS流)。通常,一个频道对应一个TS流,一个频道的TS流由多个节目及业务组成。PS是program stream的简称,就是“节目流”。DVD中采用的数据格式就是PS流.这两种流的格式是不同的,TS格式具有很强的错误校正功能,适合传输,而PS格式适合存储在媒体中. 在这里,着重描述的是TS码流格式。
什么是PID
PID是Packet identification的简称,就是“包标志符”.DVB系统把不同的数据打包成不同的数据包,用系统唯一的一个13 bits数字标志该数据的类型.例 如,PID=0x00 表示是DVB系统中的PAT包,而PID=0x10表示是DVB系统的NIT包.不同的节目(包括Video和Audio)分别采用 不同的PID,例 如,我们在PMT表中如果检测到PID=0x0120的PID是VIDEO数据,那么表示包号码是0x0120的所有包都是Video数 据,其他依此类推。
什么是PAT
PAT是Program Association Table的简称,即”节目关联表”.PAT属于DVB系统流中的一个表,表号码(PID)是0x0000.PAT表描述了DVB系统流中包含什么样的PID,主要是描述当前流的NIT表的PID号码是多少,当前流中有多少个不同类型PMT表,每个PMT表对应的频道号等信息。
什么是PMT
PMT是Program Map Table的简称,即”节目映射表”。PMT的 PID 是服务器自由定义的(但不会和系统保留的PID冲突)。这个PID是在PAT表中描述的,比如,如果在PAT表中有program_map_PID为0x100项的内容,那么说明 所有 PID是0x100的包都是PMT表。不同的频道有不同的PMT,也就是说,一个不同的PMT代表的是一个不同频道。PMT表和PAT表配合在 一起, 就可以检测出DVB流中所有存在节目的PID,因此,数字电视搜台就是依靠这两个表格数据完成的。
什么是CAT
CAT是Conditional Access Table的简称,即“条件访问表”,PID是0x01.CAT携带的是服务器的私有信息(CA系统就需要使用该表格实现节目的解密),将一个或多个专用EMM流分别与唯一的PID相关联。
什么是SDT
SDT是Service Description Table的简称,即“服务描述表”,PID是0x11,SDT携带的是业务数据比如电视台名称和电视节目名称、起始时间、持续时间等。DVB接收系统接收SDT表中的节目信息,实现比较友好的界面显示和操作.
什么是BAT
BAT是 Bouquet Association Table 的简称,即“业务群关联表”。给出业务群的名称及其业务列表等信息。将网络中所有的业务分成了多个业务群,比如体育业务群,科普业务群。这些业务
可以不在同一个传输流中。
什么是NIT和EIT
NIT是Network Information Table的简称,即“网络信息表“。该表的PID是由PAT提供给出的。
EIT是Event Information Table的简称,即“事件信息表”。
NIT描述整个网络。作用主要是对多路传输流的识别,NIT提供多路传输流,物理网络及网络传输的相关的一些信息,如用于调谐的频率信息以及编码方式。调制方式等参数方面的信息。
EIT表示对某一路节目的更进一步的描述。它提供事件的的名称,开始时间,时间长度,运行状态等,是生成EPG的主要表。
什么是EPG
EPG是Electronic Programme Guides的简称,即“电子节目指南”.该功能可实现预告近段时间即将播放的节目内容,同时支持基于内容的检索.生成EPG的数据来源于DVB码流中的业务信息(SI)和节目引导信息(PSI)
什么是teletext
Teletext就 是 我们常说的“图文电视”,当然在MPEG-2中,图文电视已经数字化,也就是说,图文信息已经做为数字化信息在TS流中传播.但最终,数字化的图文信 息 都将转化为模拟的VBI信息插入到正常的电视信号中实现图文电视的显示.图文电视有很多标准,比如close caption,WSS等,欧洲的 DVB使 用的teletext标准是ITU-R System B Teletext规格.该规格支持欧洲多种语言,支持简单图象和文本的混合显示.
名词解析:
什么是“业务”,什么是“事件”呢?一般来说,“业务”就是指“频道”,“事件”就是“节目”。这里需要明确“节目”的概念,举个例子:CCTV1是一个频道,也就是我们所说的“业务(Service)”;《新闻联播》是一个节目,也就是我们所说的“事件”。分清楚了这两个概念,我们才能区分很多SI信息。
不论是视频、音频、文字、图片还是业务信息(包括PSI/SI)都将被划分为最基本的ES,并将它们通过PES的形式组装起来,经过复用形成TS流。
对TS流的解析:首先获取TS流中的包Packet,根据其PID过滤出需要的包,根据其section的结构还原成section,再由上层协议来处理。
ES流(ElementaryStream):基本码流,不分段的音频、视频或其他信息的连续码流。
PES流:把基本流ES分割成段,并加上相应头文件打包成形的打包基本码流。
DVB根据应用的不同,主要分为DVB-S,DVB-C,DVB-T,DVB-H等多种规格.不同的规格基本原理都是相同的,不同的主要是调制方式不同:
DVB-S,S是Satelite的首字母,应用于数字电视卫星广播,调制方式是QPSK.
DVB-C,C是Cable的首字母,应用于城市有线广播.调制方式是QAM所有格式: 16QAM,32QAM,64QAM,128QAM,256QAM.
DVB-T,T是Terrestrial的首字母,应用于陆地无线广播,调制方式是QPSK或者16QAM和64QAM.
DVB-H,H是Handheld的首字母,应用于手持无线广播,调制方式和DVB-T相同.
总 的 来说,不同的DVB系统只有前端系统是不同的,最终的数字信息都是相同的,也就是都是采用ISO13818描述的规格。前端系统主要是指调制方法和发 射 方法等.因此,这里所叙述的内容,全部适用于所有的DVB系统,同时因为美国的ATSC系统也是在DVB系统上的小量更改和小部分功能增加,因此也适 用于 ATSC标准.
基本系统描述如下:
(1)编码系统
假 设 信号源有6个节目,则DVB系统先对这6个节目的所有数据(Video,Audio)进行压缩处理,然后经过一个叫做”复用”的程序进行节目的复 用 (PID分配,即对6个节目分别分配不同的PID号码)形成叫做”PES”的包,然后再经过TS流处理程序,把这些PES包全部封装成TS码流格式, 最后 把获得的TS格式的数字信号经过调制(实现的是频率的复用),然后经过D/A转换成模拟信号,再次调制成高频信号,经传输系统发送出去.
(2)解码系统
接 收 系统接收到高频信号,先转化为中频信号,然后再经过一个高速的A/D转换成数字信号,接着经过一个反调制程序,这样就得到了TS码流. TS码流进入 一 个称为”解复用”的程序,该程序实现自动分析TS流中的表信息,读取所有可用的PID信息等,然后提取一个用户指定的PID(用户选择的节目),把 该节 目的数字信号全部接收而忽略其他不需要的信号,然后Video,Audio信号分别进入不同的解压缩程序,分别对Video,Audio信号进行解压缩和显示,如果该节目包含了Teletext和EPG,也有可能同时处理Teletext和EPG,并且把处理的结果和Video信号一起叠加到屏幕 上.
Packet的概念
(1)TS流是基于Packet的位流格式,每个包是188字节或者204字节(一般是188字节,204字节的格式仅仅是在188字节的Packet后部加上16字节的CRC数据,其他格式是一样的),整个TS流组成如下所示:
Packet 1 Packet 2 …… Packet n
在实际使用中,因为TS流内部已经具有很强的错误处理能力,所以一般使用较多的是188字节一个包的格式,204字节一个包的格式据说一般在高清节目中使用较多.
所有的Packet格式都是统一的,包括一个Packet header和Packet datas.其中Packet header包含了同步字节(该字 节固定是0x47,表示这个包的数据开始是正确的),该Packet的唯一号码(即PID)和其他一些信息.格式如下(用C代码格式表示):
typedef struct
{
unsigned sync_byte:8; /*8 bits的同步字节*/
unsigned transport_error_indicator:1; /*1 bit的错误指示信息,1表示当前Packet至少有1bit的传输错误,0表示所有数据都正确*/
unsigned payload_unit_start_indicator:1;/*负载单元开始标志,请参考ISO13818-1了解该标志作用*/
unsigned transport_priority:1; /*1 bit的传输优先级标志,1表示高优先级,0表示低优先级*/
unsigned PID:13; /*13 bits的Packet ID号码,唯一的号码对应不同的包*/
unsigned transport_scrambling_control:2;/*2 bits的加密标志,00表示没有加密,其他表示已被加密*/
unsigned adaptation_field_control:2; /* 2 bits的附加区域控制,请参考ISO13818-1了解该标志作用*/
unsigned continuity_counter:4; /*4 bits的包递增计数器*/
}PACKET_HEADER;
以上结构刚好占用32 bits,即4个字节,因此一个TS流的Packet头部的4字节是header信息,分析该header信息就可以知道当前Packet的属性.剩下的184字节有可能是Video数据,也有可能是Audio数据,也有可能是DVB SI信息,怎 么 区分呢?其实很简单,就是利用header中的PID信息.上一章说了PAT是节目关联表,它的PID是0x0000.这个PID就是对应这 里 header的PID.换句话就是说,如果我们发现一个Packet的PID等于0x0000,那么说明这个Packet是DVB的PAT表格而不 是 Video数据或者Audio数据.
实 际 上,在信号编码成TS码流的时候,不同节目的Video,Audio等数据都分配了不同的PID.例如,一个节目有两路Video,三路Audio, 那么分配PID的时候可能是Video1==0x100,Video2==0x101,Audio1==0x102,Audio2==0x103, Audio3==0x104, 这样传输的TS码流中的PID就可能有以上的PID.因此,如果我们需要在程序中过滤出第一路Video和第二路 Audio就可以这样处理了(伪代码描述):
void Process_Packet(unsigned char*buff)
{
int PID=GETPID(buff); /*从当前的188字节缓冲区中获取PID信息*/
if(PID==0x100) /*PID等于第一路Video的PID,说明当前数据是Video数据*/
{
SaveToVideoBuffer(buff+4); /*把header后部的数据存到Video缓冲区,待后部处理*/
}
else if(PID==0x103) /*PID等于第二路Audio的PID,说明当前数据是Audio数据*/
{
SaveToAudioBuffer(buff+4); /*把header后部的数据存到Audio缓冲区*/
}
else /*其他PID则丢弃,当然如果PID是DVB系统保留的PID如PAT,PMT则必须处理*/
{
printf("unknown PID!\n");
}
}
返回目录
SI是 Specific Information的简称,PSI是program Specific Information的简称。该机制允许DVB传送各种各样的讯息,比如节目名称,电视台名称,私有信息,甚至单独传送数据实现数据通信等。这些功能的实现都归功于PSI/SI.
在DVB标准中,定义了一些标准的PID用来实现SI/PSI.这些PID是系统保留的,因此DVB编码的时候并不会用这些PID做为Video PID 或者 Audio PID或者其他PID.在一个简单的解复用程序中,只需要提供处理PAT,PMT表格的程序即可实现解复用,当然如果需要更友好的界面和实现更复杂的功能(如CA)则必须处理其他的SI表.
DVB规定携带SI信息的传输包必须用指定的PID,指定的PID如下表:
表 | PID值 |
---|---|
PAT | 0x0000 |
CAT | 0x0001 |
TSDT | 0x0002 |
预留 | 0x0003 至0x000F |
NIT, ST | 0x0010 |
SDT , BAT, ST | 0x0011 |
EIT, ST | 0x0012 |
RST, ST | 0x0013 |
TDT, TOT, ST | 0x0014 |
网络同步 | 0x0015 |
预留使用 | 0x0016 至 0x001B |
带内信令 | 0x001C |
测量 | 0x001D |
DIT | 0x001E |
SIT | 0x001F |
上表格的PID就是DVB保留的PID,分配的其他PID一定不要占用这些PID.解复用程序需要使用到的表只有PAT,PMT,SDT,而CA应用还需要使用CAT,EPG应用还需要使用NIT,EIT,TDT,TOT等表.所以在需要解复用的时候,伪代码需要这样写:
void process_packet(unsigned char*buff)
{
int PID=GETPID(buff);
if(PID==0x0000) /*这是PAT表*/
{
process_PAT(buff+4); /*处理PAT表*/
}
else if(PID==......) /*Video 或者Audio*/
{
}
else /*其他不支持的PID*/
{
printf("Unknown PID!");
}
}
所有的表格都存在于Packet中的184字节的数据部分,但有的时候一个表格没有184字节,这时在Packet中就可能插入一些无效信息用来填充使整个Packet依然保持188字节.也可能用头信息中的payload_unit_start_indicator标志表有个偏移位置 (当 payload_unit_start_indicator=0表示表数据直接从Packet区的第四个字节开始,否则表示有一个偏移量位置开始,具体 请参考ISO13818-1,第4字节到偏移量间的数据是系统填充的无效数据).
下面针对解复用程序详细分析一下各种表格的格式.(重要的是PAT,PMT和SDT三类)
返回目录
节目关联表PAT(将节目号码和节目映射表PMT的PID相关联)的意义在于,它描述了当前TS流中包含了哪些PID;只有根据获得的PID,用户才可以以此作为凭据找出其他表(如PMT表)及其信息。所以PAT是机顶盒接收的入口点,是它获取数据的开始;要保证一个TS流能被正常接收,则至少要有一个完整有效的PAT。
PAT表携带以下信息:
(1) TS流ID— transport_stream_id,该ID标志唯一的流ID
(2) 节目频道号– program_number,该号码标志TS流中的一个频道,该频道可以包含很多的节目(即可以包含多个Video PID和Audio PID)
(3) PMT的PID— program_map_PID,表示本频道使用的哪个PID做为PMT的PID,因为可以有很多的频道,因此DVB规定PMT的PID可以由用户自己定义.
PAT表定义如下:
Syntax(句法结构) | 所占位数 | Identifier(识别符) | Note(注释) |
---|---|---|---|
program_association_section(){ | |||
table_id | 8 | uimsbf | 标志本表的类型,应该是0x00 |
Section_syntax_indicator | 1 | bslbf | 段语法标志,通常设为“1” |
private_indicator | 1 | bslbf | 注释1 |
Reserved | 2 | bslbf | 保留位一般都是’0’ |
Section_length | 12 | uimsbf | 段大小,单位是Bytes |
transport_stream_id | 16 | uimsbf | 当前流ID,DVB内唯一 |
Reserved | 2 | bslbf | 保留位 |
Version_number | 5 | uimsbf | 注释2 |
Current_next_indicator | 1 | bslbf | 注释3 |
Section_number | 8 | uimsbf | 当前段号码 |
last_section_number | 8 | uimsbf | 注释4 |
for(i=0;i < N;i++){ | |||
program_number | 16 | uimsbf | 节目频道号 |
reserved | 3 | bslbf | |
if(program_number == 0){ | |||
network_PID | 13 | uimsbf | |
} | |||
else{ | |||
program_map_PID | 13 | uimsbf | PMT的PID |
} | |||
} | |||
CRC_32 | 32 | rpchof | CRC校验值,一般是会忽略的 |
} |
各字段含义如下:
注释1:
private_indicator: 1bit:固定的’0’,这是为了防止和 ISO13818 Video流格式中的控制字冲突而设置的
注释2:
version_number:5bits版本号码,标注当前节目的版本.这是个非常有用的参数,当检测到这个字段改变时,说明TS流中的节目已经变化了,程序必须重新搜索节目.
注释3:
current_next_indicator:1bit:当前还是未来使用标志符,一般情况下为’0’
注释4:
last_section_number:8bits最后段号码(section_number和last_section_number的功能是当PAT内容大于184字节时,PAT表会分成多个段(sections),解复用程序必须在全部接收完成后再进行PAT的分析)
从for()开始,就是描述了当前流中的频道数目(N),每一个频道对应的PMT PID是什么.解复用程序需要和上图类似的循环来接收所有的频道号码和对应的PMT PID,并把这些信息在缓冲区中保存起来.在后面的处理中需要使用到PMT PID.
从以上分析我们可以发现,PAT表主要包含频道号码和每一个频道对应的PMT的PID号码,这些信息我们在处理PAT表格的时候会保存起来,以后会使用到这些数据.例如我们可以定义这样的数据结构保存这些信息:
typedef struct
{
int channel_number; /*频道号*/
int pmt_pid; /*对应channel_number频道号的PMT的PID*/
}PMT_ITEM;
PMT_ITEM pmt[64]; /*定义最多64个频道,这个结构在分析PAT表格的时候会更新*/
返回目录
节目映射表PMT的意义在于,它给出了节目号与组成这个节目元素之间的映射;也就是说,PMT是连接节目号与节目元素的桥梁。我们知道,一个电视节目至少包含了视频和音频数据,而每一个节目的视音频数据都是以包的形式在TS流中传输的;所以说,一个TS流包含了多个节目的视频和音频数据包。要想过滤出一个TS流中其中一个节目的视频和音频,则需要知道这个节目中视频和音频的标识号PID。PMT表的作用就在于,它提供了每个节目视频、音频(或其他)数据包的PID。
当前频道中包含的所有Video数据的PID
当前频道中包含的所有Audio数据的PID(可以含有多路音频)
和当前频道关联在一起的其他数据的PID(如数字广播,数据通讯等使用的PID)
如果一个TS流中含有多个频道,那么就会包含多个PID不同的PMT表.检测是否是PMT的伪代码如下:
void Process_Packet(unsigned char*buff)
{
int I;
int PID=GETPID(buff);
if(PID==0x0000)/*PAT表格*/
{
Process_PAT(buff+4);
}
else if(PID==.....)/*Video PID或者Audio PID*/
{
}
else
{
/*在这里检测PID是否是PMT的PID*/
for(i=0;i<64;i++)
{
if(PID==pmt[i].pmt_pid)/*PID等于在PAT检测到的PMT PID相同*/
{
Process_PMT(buff+4);/*说明当前Packet是PMT,进入处理*/
break;
}
}
}
}
PMT定义如下:
Syntax(句法结构) | 所占位数 | Identifier(识别符) | Note(注释) |
---|---|---|---|
program_map_section(){ | |||
table_id | 8 | uimsbf | ID 应该是0x02 |
Section_syntax_indicator | 1 | bslbf | 段语法标志通常设为“1” |
private_indicator | 1 | bslbf | reserved_future_use 不为0则错 |
Reserved | 2 | bslbf | 保留位,应该是’00’ |
Section_length | 12 | uimsbf | 注释1 |
program_number | 16 | uimsbf | 注释2 |
Reserved | 2 | bslbf | 保留位,应该是’00’ |
Version_number | 5 | uimsbf | 注释3 |
Current_next_indicator | 1 | bslbf | 当前后续标志符,一般是0 |
Section_number | 8 | uimsbf | 当前段号码 |
last_section_number | 8 | uimsbf | 最后段号码,含义和PAT对应 |
reserved | 3 | bslbf | 保留位,一般是 ‘000’ |
PCR_PID | 13 | uimsbf | 注释4 |
reserved | 4 | bslbf | 保留位,一般是’0000’ |
program_info_length | 12 | uimsbf | 注释5 |
for(i=0;i < N;i++){ | |||
descriptor() | |||
} | |||
for(i=0;i < N1;i++){ | |||
stream_type | 8 | uimsbf | 注释6 |
reserved | 3 | bslbf | 保留位 |
elementary_PID | 13 | uimsbf | 注释7 |
reserved | 4 | bslbf | 保留位 |
ES_info_length | 12 | uimsbf | 注释8 |
for(j=0;j < N2;j++){ | |||
descriptor(); | |||
} | |||
} | |||
CRC_32 | 32 | rpchof | CRC校验值,一般忽略 |
} |
注释1:
section_length:16bits段长度,从program_number开始,到CRC_32(包含)的字节总数.
注释2:
program_number:16bits的频道号码,表示当前的PMT关联到的频道.换句话就是说,当前描述的是program_number频道的信息.
注释3:
version_number:版本号码,如果PMT内容有更新,则version_number会递增1通知解复用程序需要重新接收节目信息,否则version_number是固定不变的.
注释4:
PCR_PID:13bits的PCR PID,具体请参考ISO13818-1,解复用程序不使用该参数.
注释5:
program_info_length:节目信息长度(之后的是N个描述符结构,一般可以忽略掉,这个字段就代表描述符总的长度,单位是Bytes)紧接着就是频道内部包含的节目类型和对应的PID号码了.
注释6:
stream_type:8bits基本流的类型,标志是Video还是Audio还是其他数据.
注释7:
elementary_PID:13bits对应的数据PID号码(如果stream_type是Video,那么这个PID就是Video PID,如果stream_type标志是Audio,那么这个PID就是Audio PID)
注释8:
ES_info_length:和program_info_length类似的信息长度(其后是N2个描述符号)
elementary_PID和stream_type的意义在于,告知接收机基本流的类型和识别PID。
附:流类型取值说明
取值 | 描述 |
---|---|
0x00 | 国际标准保留 |
0x01 | 视频 |
0x02 | 视频或受限参数视频流 |
0x03 | 音频 |
0x04 | 音频 |
0x05 | private_sections |
0x06 | 包含专用数据的PES分组 |
0x07 | ISO/IEC 13533 MHEG |
0x08 | |
0x09 | ITU-T Rec.H.222.1 |
0x0A~0x0D | GB/T类型 |
0x0E | GB/T辅助 |
0x0F~0x7F | GB/T保留 |
0x80~0xFF | 用户专用 |
从以上的分析可以看出,只要我们处理了PMT,那么我们就可以获取频道中所有的PID信息,例如当前频道包含多少个Video,共多少个Audio,和其他数据,还能知道每种数据对应的PID分别是什么.
这样如果我们要选择其中一个Video和Audio收看,那么只需要把要收看的节目的Video PID和Audio PID保存起来,在处理Packet的时候进行过滤即可实现.
比较全面实现解复用的伪代码如下:
int Video_PID=0x07e5,Audio_PID=0x07e6;/*一般是在PMT检索后由用户自己设置这两个全局值*/
void Process_Packet(unsigned char*buff)
{
int I;
int PID=GETPID(buff); /*获取当前Packet的PID*/
if(PID==0x0000) /*0x0000表示是PAT*/
{
Process_PAT(buff+4);
}
else if(PID==Video_PID) /*和Video_PID相等,说明当前Packet是一个Video Packet*/
{
SaveToVideoBuffer(buff+4); /*保存到Video缓冲区*/
}
else if(PID==Audio_PID) /*和Audio_PID相等,说明当前Packet是一个Audio Packet*/
{
SaveToAudioBuffer(buff+4); /*保存到Audio缓冲区*/
}
else
{
for( i=0;i<64;i++)
{
if(PID==pmt[i].pmt_pid)
{
Process_PMT(buff+4);
Break;
}
}
}
}
以上伪代码可以实现基本的解复用:检测所有的频道,检测所有stream的PID,选择特定的节目进行播放.只要读取每个Packet的188字节的内容,然后每次都调用Process_Packet()即可实现简单的解复用.
返回目录
条件接收表CAT描述了节目的加密方式,它包含了节目的EMM(Entitlement Management Message,即授权管理信息。描述了用户可看的节目或时间段、用户的付费等)识别PID。它给出了一个或多个CA系统、EMM流以及与CA相关的特定参数之间的关系。
CA描述符既用于规定像EMM这样的系统范围条件接收管理信息,也用于规定像ECM这样的基本流特定信息。如果一个基本流(Elementary Stream)是加扰的,那么包含该基本流的节目信息表PMT中需要一个CA描述符,如果一个TS流中有任何一个系统范围的条件接收管理信息,则条件接收表中应有CA描述符。
CAT的表结构分析(数据成员含义无需赘言,跟上面的几乎一致)
Syntax(句法结构) | No. ofbits(所占位数) | Identifier(识别符) | Note(注释) |
---|---|---|---|
conditional_access_section(){ | |||
table_id | 8 | uimsbf | |
Section_syntax_indicator | 1 | bslbf | 通常设为 1 |
0 | 1 | bslbf | |
Reserved | 2 | bslbf | |
Section_length | 12 | uimsbf | |
reserved | 18 | bslbf | |
Version_number | 5 | uimsbf | |
Current_next_indicator | 1 | bslbf | |
Section_number | 8 | uimsbf | |
last_section_number | 8 | uimsbf | |
for(i=0;i < N;i++){ | |||
descriptor() | |||
} | |||
CRC_32 | 32 | rpchof | |
} |
条件存取段主要作用是指示本TS流中存在加扰节目,并且在描述符循环中必须插入CA描述符来作进一步指引。下面给出的是条件接收的描述符
Syntax(句法结构) | No. ofbits(所占位数) | Identifier(识别符) |
---|---|---|
CA_identifier_descriptor(){ | ||
descriptor_tag | 8 | uimsbf |
descriptor_length | 8 | uimsbf |
CA_system_ID | 16 | uimsbf |
reserved | 3 | bslbf |
CA_PID | 13 | uimsbf |
for(i=0;i < N;i++){ | ||
private_data_byte | 8 | |
} | ||
} |
CA_system_ID(CA系统ID):指出用于相关ECM及(或)EMM流的CA系统类型。
CA_PID(CA PID):指出包含用于相关CA_system_ID所规定的CA系统的ECM或EMM信息传输流分组的PID(即在TS流中过滤出相应PID的分组)。
以上参考博客:
PSI/SI深入学习2——PSI信息解析(PAT,PMT,CAT)
返回目录
BAT即业务群关联表(Bouquet Association Table),它将网络中所有的业务分成了多个业务群,以此界定用户。例如,将网络中所有业务分为两个业务群,一个是境内节目业务群,另一个是境外节目业务群。这样,国内的运营商就可以利用这样划分的业务群,充分利用节目资源,在不违反现有广电总局规定的前提下,同时分别满足境内用户和境外用户。BAT本身可以跨网络存在,但在国内运营体系来看几乎没有得到真正使用。国内的运营使用中,BAT还可以存在分级运营的运营体系中,用于区分不同的地域用户。
BAT被切分为业务群关联段,所有的业务群关联段都在TS中传输,其PID为0x0011。所有的业务群关联段的table_id都取0x4A。
SDT的TS包PID也为0x0011,其table_id为0x42或0x46。
BAT表的段结构:
Syntax(句法结构) | No. ofbits | Identifier(识别符) | Note(注释) |
---|---|---|---|
bouquet_association_section(){ | |||
table_id | 8 | uimsbf | 0x4A |
Section_syntax_indicator | 1 | bslbf | 通常设为1 |
Reserved_future_use | 1 | bslbf | |
Reserved | 2 | bslbf | |
Section_length | 12 | uimsbf | 注释1 |
bouquet_id | 16 | uimsbf | 注释2 |
Reserved | 2 | bslbf | |
Version_number | 5 | uimsbf | 注释3 |
Current_next_indicator | 1 | bslbf | 注释4 |
Section_number | 8 | uimsbf | 注释5 |
last_section_number | 8 | uimsbf | 子表的最后一个段的段号 |
Reserved_future_use | 4 | bslbf | |
bouquet_descriptors_length | 12 | uimsbf | 注释6 |
for(i=0;i < N;i++){ | |||
descriptor() | |||
} | |||
reserved_future_use | 4 | bslbf | |
transport_stream_loop_length | 12 | uimsbf | 注释7 |
for(i=0;i < N;i++){ | |||
transport_stream_id | 16 | uimsbf | 同一个传输系统中不同的复用码流 |
original_network_id | 16 | uimsbf | 原始传输系统的network_id |
reserved_future_use | 4 | bslbf | |
transport_descriptors_length | 12 | uimsbf | 注释8 |
for(j=0;j < N;j++){ | |||
descriptor() | |||
} | |||
} | |||
CRC_32 | 32 | rpchof | CRC值 |
} |
注释1:
前两位置”00”。它表示从该字段的下一个字节开始的本段的字节长度,并包含CRC。section_length不能超过1021,这样整个段的最大长度为1024字节。
注释2:
业务群标识符,用于标识业务群。该字段值的分配见ETR 162。
注释3:
标识子表的版本号。当子表包含的信息发生变化时,version_number加1。当值增至31时,复位为0。当current_next_indicator置“1”时,则version_number为由table_id和bouquet_id定义的当前使用的子表的版本号。当current_next_indicator置“0”时,则version_number为由table_id和bouquet_id定义的下一个使用的子表的版本号。
注释4:
当前后续指示符current_next_indicator:1位指示符。当被置“1”时,表示当前子表正被使用。当其置“0”时,表示所传子表尚未被使用,它是下一个将被使用的子表。
注释5:
段号,子表中的第一个段的section_number标为“00”。每增加一个具有相同的table_id和bouquet_id的段,section_number就加1。
注释6:
业务群描述符长度,给出了从本字段的下一个字节开始的业务群描述符的总字节长度。
注释7:
传输流循环长度,定义了从本字段的下一个字节到第一个CRC-32字节之前的传输流循环的总字节长度。
注释8:
传输流描述符长度,指出从本字段的下一个字节开始的TS描述符的总字节长度。
BAT可以插入传输系统描述符、业务列表描述符等。
BAT的业务群名称描述符结构 ANALYZE OF THE STRUCTURE OF BOUQUET_NAME_DESCRIPTORINBAT
Syntax(句法结构) | No. ofbits(所占位数) | Identifier(识别符) |
---|---|---|
bouquet_name_descriptor(){ | ||
descriptor_tag | 8 | uimsbf |
descriptor_length | 8 | uimsbf |
for(i=0;i < N;i++){ | ||
char | 8 | uimsbf |
} | ||
} |
char(字符):8位字段,用于描述BAT子表叙述的节目业务群名称
业务名称描述符和网络名称描述符类型,只是作为业务群的一个代号,其实际意义只存在于用户界面上,可以给用户一个良好的操作体验。
返回目录
机顶盒先调整高频头到一个固定的频率(如498MHZ),如果此频率有数字信号,则COFDM芯片(如MT352)会自动把TS流数据传送给 MPEG-2 decoder. MPEG-2 decoder先进行数据的同步,也就是等待完整的Packet的到来.然后循环查找是否出现 PID== 0x0000的Packet,如果出现了,则马上进入分析PAT的处理,获取所有的PMT的PID.接着循环查找是否出现PMT,如果发现 了,则自动进入PMT分析,获取该频段所有的频道数据并保存.如果没有发现PAT或者没有发现PMT,说明该频段没有信号,进入下一个频率扫描.
从以上描述可以看出,机顶盒搜索频率是随机发生的,要使每次机顶盒都能搜索到信号,则要求TS流每隔一段时间就发送一次PAT和PMT.事实上DVB传输系统就是这么做的.因此无论何时接入终端系统,系统都能马上搜索到节目并正确解复用实现播放.不仅仅如此,其他数据也都是交替传送的.比如第一个Packet可能是PAT,第二个Packet可能是PMT,而第三个Packet可能是Video 1,第四个Packet可能是Video 2,只要系统传输速度足够快(就是称之为”码率”的东东),实现实时播放是没有任何问题的。
到这里虽然实现了解复用,但可以看出,使用的PID都是枯燥的数字,如果调台要用户自己输入数字那可是太麻烦了,而且还容易输入错误,操作非常不直观,即使做成一个菜单让用户选择也是非常的呆板.针对这个问题,DVB系统提出了一个SDT表格,该表格标志一个节目的名称,并且能和PMT中的PID联系起来,这样用户就可以通过直接选择节目名称来选择节目了。
SDT即服务描述表(Service Description Table),它描述了一个业务中的内容以及信息,它承上启下,以transport_stream_ID连接了NIT和EIT;SDT的servicID必须与PMT中的Program_no一致,因此,SDT又与PSI的信息连接。
对于一般的音视频业务,SDT表中不会有太多的信息需要添加。如果是其他业务(如NVOD、马赛克、数据广播等),在SDT中需要插入相应业务的描述符。
SDT表被切分成业务描述段(service_description_section),由PID为0x0011的TS包传输(BAT段也由PID为0x0011的TS包传输,但table_id不同)。
描述现行TS(即包含SDT表的TS)的SDT表的任何段的table_id都为0x42,且具有相同的table_id_extension(transport_stream_id)以及相同的original_network_id。指向非现行TS的SDT表的任何段的table_id都应取0x46。
SDT可以提供的信息包括,该节目是否在播放中,该节目是否被加密,该节目的名称。每一个传输流中都有一个独立的sdt子表。为了提高对service的采集,定义了下列规则:
强制传输当前ts的sdt
sdt列出的si比特流至少包括ts中所有服务
当前ts(例如table_id=0x46)中sdt描述其他ts时,应当列出这个ts的所有service
下面给出了SDT的业务描述段:
Syntax(句法结构) | No. ofbits(所占位数) | Identifier(识别符) | Note(注释) |
---|---|---|---|
service_description_section(){ | |||
table_id | 8 | uimsbf | 注释1 |
Section_syntax_indicator | 1 | bslbf | 通常设为1 |
Reserved_future_use | 1 | bslbf | |
Reserved | 2 | bslbf | |
Section_length | 12 | uimsbf | 注释2 |
transport_stream_id | 16 | uimsbf | 当前描述的流ID |
Reserved | 2 | bslbf | |
Version_number | 5 | uimsbf | 版本号码,如果数据更新则此字段递增1 |
Current_next_indicator | 1 | bslbf | 注释3 |
Section_number | 8 | uimsbf | |
last_section_number | 8 | uimsbf | |
original_nerwork_id | 16 | uimsbf | 原始网络ID号 |
reserved_future_use | 8 | bslbf | |
for(i=0;i < N;i++){ | N个节目信息的循环 | ||
service_id | 16 | uimsbf | 注释4 |
reserved_future_use | 6 | bslbf | |
EIT_schedule_flag | 1 | bslbf | 注释5 |
EIT_present_following_flag | 1 | bslbf | 注释6 |
running_status | 3 | uimsbf | 注释7 |
freed_CA_mode | 1 | bslbf | ‘1’表示该节目被加密 |
descriptors_loop_length | 12 | uimsbf | |
for(j=0;j < N;j++){ | |||
descriptor() | |||
} | |||
} | |||
CRC_32 | 32 | rpchof | 校验 |
} |
各字段定义如下:
注释1:
table_id:8bits的ID,可以是0x42,表示描述的是当前流的信息,也可以是0x46,表示是其他流的信息(EPG使用此参数)
注释2:
section_length:12bits的段长度,单位是Bytes,从transport_stream_id开始,到CRC_32结束(包含)
注释3:
current_next_indicator:当前未来标志,一般是0
,表示当前马上使用。
注释4:
service_id:16 bits的服务器ID,实际上就是PMT段中的program_number.
注释5:
EIT_schedule_flag:1bit的EIT信息,1表示当前流实现了该节目的EIT传送
注释6:
EIT_present_following_flag:1bits的EIT信息,1表示当前流实现了该节目的EIT传送
注释7:
running_status:3bits的运行状态信息:0-未定义,1-未播放 2-几秒钟后马上开始,3-被暂停播出,4-正在播放,5~7—保留
SDT是描述一个TS流中所有业务信息的一张表,重要的字段包含transport_stream_id,明确这些业务是属于哪个TS流的;另一个重要字段时候service_id,这是作为频道索引信息存在的。
紧接着的是描述符,一般是Service descriptor,分析此描述符可以获取servive_id指定的节目的节目名称。
SDT的业务描述符分析 ANALYZE OF THE STRUCTURE OF SERVICE_DESCRIPTOR IN SDT
业务描述符与业务类型一起,以文本形式给出业务提供者的名称和业务名称,如下表:
Syntax(句法结构) | No. ofbits(所占位数) | Identifier(识别符) |
---|---|---|
service_descriptor(){ | ||
descriptor_tag | 8 | uimsbf |
descriptor_length | 8 | uimsbf |
service_type | 8 | uimsbf |
service_provider_name_length | 8 | uimsbf |
for(i=0;i < N;i++){ | ||
Char | 8 | uimsbf |
} | ||
service_name_length | 8 | uimsbf |
for(i=0;i < N;i++){ | ||
Char | 8 | uimsbf |
} | ||
} |
业务类型:这里的业务类型和NIT中的 业务列表描述符 中的service_type编码是一致的:
service_type | 描述 |
---|---|
0x00 | 预留使用 |
0x01 | 数字电视业务 |
0x02 | 数字音频广播业务 |
0x03 | 图文电视业务 |
0x04 | NVOD参考业务 |
0x05 | NVOD时移业务 |
0x06 | 马赛克业务 |
0x07 | PAL制编码信号 |
0x08 | SECAM制编码信号 |
0x09 | D/D2-MAC |
0x0A | 调频广播 |
0x0B | NTSC制信号 |
0x0C | 数据广播业务 |
0x0D | 公共接口使用预留 |
0x0E | RCS映射(见EN 301 790) |
0x0F | RCS FLS(见EN 301 790) |
0x10 | DVB MHP业务 |
0x11~0x7F | 预留使用 |
0x80~0xFE | 用户定义 |
0xFF | 预留使用 |
业务描述符是SDT中最重要的描述符,也是运营商中必须的描述符。其中的service_type描述这个业务类型的域;service_name描述频道名。
至此分析完毕,节目名称和节目号码已经联系起来了.机顶盒程序就可以用这些节目名称代 替 PID让用户选择,从而实现比较友好的用户界面。
PSI/SI深入学习3——SI信息解析2(SDT, EIT, TDT,TOT)
EPG就 是“电子节目指南”,相当于一个节目菜单的功能.在一个TS流中,可以提供当前流的所有信息,如频率,调制方式,频道号,所有节目的PID,名称等信息, 也可以根据需要提供其他相关联的TS流(例如同一电视台同步播放的其他频率的节目信息)的信息.解码器接收这些信息,形成一个固定格式的菜单让用户选择需要收看的频道或节目,这就是”EPG”.不仅如此,EPG还可以对节目进行分类,比如节目可以是电影,也可以是新闻,这样,把属于电影的节目归在一 起,把 属于新闻的节目归在一起,这样对用户来说检索节目就变得非常的方便.
EPG的实现也归功于DVB的SI信息.和EPG功能相关的SI有NIT(网络信息表),EIT(环境信息表),SDT(服务描述表),BAT(群组关联表),TDT(日期时间表)和TOT(时间偏移表).下面简单分析这些表所携带的信息.NIT,Network Information Table,网络信息表NIT提供如网络名称(相当于电视台名称),传输参数(如频率,调制方式等).这个表格一般是解码器内部使用的数据,当然也可以做为EPG的一个显示数据提供给用户做为参考.
返回目录
NIT提供如网络名称(相当于电视台名称),传输参数(如频率,调制方式等).这个表格一般是解码器内部使用的数据,当然也可以做为EPG的一个显示数据提供给用户做为参考,但这个表本身的信息有限,更多的信息是依靠插入表中的描述符来提供的。NIT常用的描述符有:网络名称描述符(network_name_descriptor)、有线传送系统(cable_delivery_system_descriptor)、业务列表描述符(service_list_descriptor)和链接描述符(linkage_descriptor)。
NIT的表结构分析 ANALYZE OF THE STRUCTURE OF NIT
网络信息表(NIT)传递了与通过一个给定的网络传输的复用流/TS流的物理结构相关的信息,以及与网络自身特性相关的信息。
Syntax(句法结构) | No. ofbits(所占位数) | Identifier(识别符) | Note(注释) |
---|---|---|---|
network_information_section(){ | |||
table_id | 8 | uimsbf | 注释0 |
Section_syntax_indicator | 1 | bslbf | 通常设为 1 |
Reserved_future_use | 1 | bslbf | 保留未来使用位,一般是 0 |
Reserved | 2 | bslbf | 一般是’00’,防止控制字冲突而设置 |
Section_length | 12 | uimsbf | 注释1 |
Network_id | 16 | uimsbf | 注释2 |
Reserved | 2 | bslbf | 保留意见位 |
Version_number | 5 | uimsbf | 注释3 |
Current_next_indicator | 1 | bslbf | 当前下次使用标志,一般是’0’ |
Section_number | 8 | uimsbf | 当前段号码 |
last_section_number | 8 | uimsbf | 见注释 |
Reserved_future_use | 4 | bslbf | 未来使用,应该是’0000’. |
Network_descriptors_length | 12 | uimsbf | 网络描述符长度,字节单位 |
for(i=0;i < N;i++){ | N个不同的描述符结构 | ||
descriptor() | //First descriptor loop注释4 | ||
} | |||
reserved_future_use | 4 | bslbf | 保留位,当前应是’0000’ |
transport_stream_loop_length | 12 | uimsbf | 随后的循环的字节总数 |
for(i=0;i < N;i++){ | |||
transport_stream_id | 16 | uimsbf | |
original_network_id | 16 | uimsbf | 注释5 |
reserved_future_use | 4 | bslbf | |
transport_descriptors_length | 12 | uimsbf | 随后的N个描述符占用的字节总数 |
for(j=0;j < N;j++){ | |||
descriptor() | //Second descriptor loop 注释6 | ||
} | |||
} | |||
CRC_32 | 32 | rpchof | 整个段的CRC校验值,一般可以忽略. |
} |
NIT格式如下:
注释0:
table_id:8 bits标志,应该是0x40或0x41.当table_id==0x40时候,这个NIT描述的是当前流的网络信息,否则描述的是其他流的网络信息(一般是电视台同步播放的其他TS流信息).
注释1:
section_length:12bits段长度,从network_id开始,到CRC_32(包含)结束的字节总数.
注释2:
network_id:16bits的网络ID号码,DVB内唯一的一个号码,标志不同的电视台.
注释3:
version_number:5bits的版本号码,当NIT内容有任何改变时,该字段会递增1(提醒解码器更新NIT信息).
注释4:
descriptor():,一般是网络名称描述符,解码器在此获取当前的网络名称(即电视台名称)
注释5:
original_network_id:16bits原始网络ID.如果original_network_id== transport_stream_id说明该TS流是直播节目,否则说明该TS流是转播节目.
注释6:
descriptor(),N个描述符,可以有多个连续但不相同的描述符号,如网络名称描述符,传输系统参数描述符,解码器分析这些描述符获取网络的不同信息.
在SI标准中规定:original_network_id和transport_stream_id两个标识符相结合唯一确定了网络中的TS流。各网络被分配独立的network_id值作为网络的唯一识别码。当NIT表在生成TS流的网络上传输时,network_id和original_network_id将取同一值。
NIT表被切分为网络信息段(network_information_section)
任何NIT的段都必须由PID为0x0010的TS包传输
现行网络的NIT表任何段的table_id值应为0x40,且具有相同的table_id_extension即(network_id);
现行网络以外的其他网络NIT表的段table_id值应为0x41
注意到这里出现了两个循环,分别称为为第一层循环和第二层循环;每层循环都插入了一个描述符,也就是一共插入了两个描述符。第一层描述符 作用域是针对整个网络的,如插入网络名称描述符、链接描述符等 ;第二层描述符 作用域是第一层循环所代表的一个TS流,如插入有线传输系统描述符 。
ANALYZE OF THE STRUCTURE OF SERVICE_LIST_DESCRIPTOR IN NIT
返回目录
业务列表描述符通过业务标识符和业务类型提供业务服务。其目的在于:告诉接收机每一个TS流中存在多少个业务以及每一个业务的类型。其结构如下:
Syntax(句法结构) | No. ofbits(所占位数) | Identifier(识别符) |
---|---|---|
service_list_descriptor(){ | ||
descriptor_tag | 8 | uimsbf |
descriptor_length | 8 | uimsbf |
for(i=0;i < N;i++){ | ||
service_id | 16 | uimsbf |
service_type | 8 | uimsbf |
} | ||
} |
service_id(业务标识符):唯一标识TS中的一个业务,它与program_map_section中的program_number(参看PMT表结构)相同。但当业务类型为0x04时(即NVOD参考业务),service_id没有对应的program_number。
service_type(业务类型):指示业务的类型。如0x01为数字电视业务,0x02为数字音频广播业务,0x04为NVOD参考业务,0x05为NVOD时移业务。
注意这里的service_type 和前面提到的 SDT业务描述符的service_type定义是完全一致的。
ANALYZE OF THE STRUCTURE OF CABLE_DELIVERY_SYSTEM_DESCRIPTOR IN NIT
返回目录
有线传输系统描述符(Cable_Delivery_System_descriptor)是NIT业务中重要的描述符,也是基本运营所必需的描述符。它主要描述了每一个TS流的物理参数(频率、调制方式、符码率等),使接收机能正确锁频、得到数据。其结构如下:
Syntax(句法结构) | No. ofbits(所占位数) | Identifier(识别符) |
---|---|---|
cable_delivery_system_descriptor(){ | ||
descriptor_tag | 8 | uimsbf |
descriptor_length | 8 | uimsbf |
frequency | 32 | bslbf |
reserved_future_use | 12 | bslbf |
FEC_outer | 4 | bslbf 前向纠错外码 |
modulation | 8 | bslbf |
symbol_rate | 28 | bslbf |
FEC_inner | 4 | bslbf 前向纠错内码 |
} |
Frequency(频率):32位,以8个4位BCD码给出频率。其单位是MHz,小数点位于第四个BCD码之后,如0312.0000MHz。
Modulation(调制方式):指出有线传输系统的调制方式。其定义如下表:
调制方式(十六进制) | 描述 |
---|---|
0x00 | 未定义 |
0x01 | 16 QAM |
0x02 | 32 QAM |
0x03 | 64 QAM |
0x04 | 128 QAM |
0x05 | 256 QAM |
0x06~0xFF | 预留使用 |
symbol_rate(符码率):28位,以7个4位BCD码表示符码率。其单位是MSPS(兆符号每秒),小数点位于第三个BCD码后,如027.4500 MSPS
ANALYZE OF THE STRUCTURE OF NETWORK_NAME_DESCRIPTOR IN NIT
返回目录
网络名称描述符的功能比较简单,它以字符串的形式将网络的名称告诉接收机。下面是其描述符结构列表:
Syntax(句法结构) | No. ofbits(所占位数) | Identifier(识别符) |
---|---|---|
network_name_descriptor(){ | ||
descriptor_tag | 8 | uimsbf |
descriptor_length | 8 | uimsbf |
for(i=0;i < N;i++){ | ||
char | 8 | uimsbf |
} | ||
} |
char(字符):8位字段,一个字符串,给出NIT表指定的传送系统的名称。
ANALYZE OF THE STRUCTURE OF LINKAGE_DESCRIPTOR IN NIT
返回目录
Syntax(句法结构) | No. ofbits(所占位数) | Identifier(识别符) |
---|---|---|
linkage_descriptor(){ | ||
descriptor_tag | 8 | uimsbf |
descriptor_length | 8 | uimsbf |
transport_stream_id | 16 | uimsbf |
original_network_id | 16 | uimsbf |
service_id | 16 | uimsbf |
linkage_type | 8 | uimsbf |
for(i=0;i < N;i++){ | ||
private_data_byte | 8 | bslbf |
} | ||
} |
如果用户要求得到SI系统描述的特定实体的进一步信息,则可以使用链接描述符。链接描述符包含的信息给出了该实体的位置。如:可以在一个NIT中使用一个链接描述符,给出网络中可存放业务附加信息的位置;或者在BAT表中的链接描述符可链接到业务群的相关信息等。
使用链接描述符,也可以提供一种业务,以替换CA系统的功能。如果CA系统不能处理相应功能的时候,接收机就可以用这个业务来取代CA。
使用链接描述符,还可以以一种备用业务,用以替换主业务。若主业务的运行状态被置为“not_running”,那么,接收机可以自动选择被链接描述符指引的备用业务,以取代该业务。
使用链接描述符,还可以向移动接收机提供漫游功能。若现行业务其service_id下无法使用,IRD可以自动选择该功能。hand-over_type指明link_descriptor是否链接到不同国家的同一业务,或者链接到本地变更业务或关联业务。
总之,链接描述符为运营商提供了一种业务扩充功能,使得运营商可以更加灵活地组合各种业务。
返回目录
事件信息表提供如下信息:节目段的标识号、起始时间、节目长度、播放状态、是否加密;指向特定信息的链接信息;节目段多语种的简短介绍;节目段的详细介绍;两段同样节目段的时间偏移;基本码流类型,如视频的幅型比、伴音的类型、字幕的类型等;使用的加密系统;节目类型,如电影/戏剧、新闻、综艺、体 育、少 儿、音乐、艺术、社会政治、文教等;节目限定年龄的级别;给出实现交互式回传信道的电话号码;为满足各节目段的码率而提供的缓存大小信息及私有数 据等。是EPG中绝大部分信息的携带者。事实上,EPG主要就是通过SDT和EIT信息的获取和重组实现的。SDT只提供了频道信息,而EIT则提供各频道下的所有节目的信息。
事件信息表中提供了类似于广播电视报所提供的节目表的内容,在SI中,只有EIT才有可能被加密。根据EIT及其它表所提供的信息,可以出五花八门的电子节目指南。-如:按节目类型检索、按时间检索及对某类节目的锁定等.
EIT的主要信息也是通过插入的描述符来实现的。EIT按照时间顺序提供每一个业务所包含的事件的相关信息(如节目名称、节目简介)。
传输流 | 信息 | table_id |
---|---|---|
当前TS流 | 当前/后续事件信息 | 0x4E |
其他TS流 | 当前/后续事件信息 | 0x4F |
当前TS流 | 事件时间表信息 | 0x50~0x5F |
其他TS流 | 事件时间表信息 | 0x60~0x6F |
按照不同的table_id,一共有四类EIT。其中,当前TS流的所有EIT子表都有相同的transport_stream_id和original_stream_id。
EIT的表结构分析 ANALYZE OF THE STRUCTURE OF EIT
EIT表被切分成事件信息段。任何构成EIT的段都由PID=0x0012的TS包传输。下面给出的是事件信息段的结构:
Syntax(句法结构) | No. ofbits(所占位数) | Identifier(识别符) | Note(注释) |
---|---|---|---|
event_information_section(){ | |||
table_id | 8 | uimsbf | |
Section_syntax_indicator | 1 | bslbf | 通常设为 1 |
Reserved_future_use | 1 | bslbf | |
Reserved | 2 | bslbf | |
Section_length | 12 | uimsbf | 见注释 |
service_id | 16 | uimsbf | 与PAT中的 program_number 一致 |
Reserved | 2 | bslbf | |
Version_number | 5 | uimsbf | 见注释 |
Current_next_indicator | 1 | bslbf | 见注释 |
Section_number | 8 | uimsbf | 见注释 |
last_section_number | 8 | uimsbf | 见注释 |
transport_stream_id | 16 | uimsbf | 见注释 |
original_nerwork_id | 16 | uimsbf | 见注释 |
segment_last_section_number | 8 | uimsbf | 见注释 |
last_table_id | 8 | uimsbf | 见注释 |
for(i=0;i < N;i++){ | |||
event_id | 16 | uimsbf | 事件(节目)id |
start_time | 40 | bslbf | 事件(节目)开始时间 |
duration | 24 | bslbf | 事件(节目)持续始时间 |
running_status | 3 | uimsbf | 见注释 |
freed_CA_mode | 1 | bslbf | 见注释 |
descriptors_loop_length | 12 | uimsbf | |
for(j=0;j < N;j++){ | |||
descriptor() | |||
} | |||
} | |||
CRC_32 | 32 | rpchof | 见注释 |
} |
start_time(开始时间):40位字段,指的是事件(节目)的开始时间,它包含以UTC和MJD形式表示的事件(节目)的起始时间及日期。此字段前16位表示MJD日期码,其余24位按4位BCD编码,表示6个数字。例如:93/10/13 12:45:00被编码为:“0xc079124500”
如果事件起始时间未定,则所有位都置为“1”,例如对NVOD业务的一个事件。
duration(持续时间):24位字段,表示事件的持续时间,以时、分、秒的格式表示,即由6个4位BCD码显示。如:01:45:30被编码为“0x14530”。
running_status(运行状态):参看SDT表解析部分。
EIT主要承载的信息就是Event的相关内容,即节目信息。其中,节目所在频道(service_id)、开始时间(start_time)、结束时间(start_time+duration)可在EIT子表获取;而节目描述、节目名称、节目分类等信息就要在插入EIT的描述符中获取了。
ANALYZE OF THE STRUCTURE OF SHORT_EVENT_DESCRIPTOR IN EIT
返回目录
短事件描述符(Short_event_descriptor)以文本方式提供了事件名称和该事件的简短描述。描述符结构如下:
Syntax(句法结构) | No. ofbits(所占位数) | Identifier(识别符) |
---|---|---|
short_event_descriptor(){ | ||
descriptor_tag | 8 | uimsbf |
descriptor_length | 8 | uimsbf |
ISO_639_language_code | 24 | bslbf |
event_name_length | 8 | uimsbf |
for(i=0;i < event_name_length;i++){ | ||
event_name_char | 8 | uimsbf |
} | ||
text_length | 8 | uimsbf |
for(i=0;i < text_length;i++){ | ||
text_char | 8 | uimsbf |
} | ||
} |
ISO_639_language_code(ISO 639-2语言代码):24位字段,指明后续文本字段的语言。该字段包含一个由ISO 639-2定义的3字符代码。ISO 639-2/B和ISO 639-2/T均可使用。每个字符按照GB/T15273.1-1994编码为8位,并依次插入24位字段。如:法语的3字符代码“fre”,可编码为:“0110 01100111 0010 0110 0101”。
event_name_char(事件名称字符):一个字符串给出事件的名字。
text_char(文本字符):一个字符串给出事件的文本描述。
返回目录
ANALYZE OF THE STRUCTURE OF EXTENDED_EVENT_DESCRIPTOR IN EIT
扩展事件描述符(Extended_Event_Descriptor)扩展事件描述符给出了一个事件的详细文本描述。如果一个事件的信息长度超过256字节,可以使用多于一个相关联的扩展事件描述符来描述。文本信息可以分为两个栏目,一栏为条目的描述,另一栏为条目的内容。
Syntax(句法结构) | No. ofbits(所占位数) | Identifier(识别符) |
---|---|---|
extended_event_descriptor(){ | ||
descriptor_tag | 8 | uimsbf |
descriptor_length | 8 | uimsbf |
descriptor_number | 4 | uimsbf |
last_descriptor_number | 4 | uimsbf |
ISO_639_language_code | 24 | bslbf |
length_of_items | 8 | uimsbf |
for(i=0;i < N;i++){ | ||
item_description_length | 8 | uimsbf |
for(j=0;j < N;j++){ | ||
item_description_char | 8 | uimsbf |
} | ||
item_length | ||
for(j=0;j < N;j++){ | ||
item_char | ||
} | ||
} | ||
text_length | ||
for(i-0;i < N;i++){ | ||
text_char | ||
} | ||
} |
返回目录
运行状态表(RST)能准确而迅速地的更新一个或多个事件的时间状态。因为时间表的变化,事件的开始可能提前或滞后,所以RST表的存在是非常必要的。使用一个独立的表可以保证快速更新机制的实现。
RST表被切分成运行状态段。任何构成RST表的段,都要由PID为0x0013的TS包传输,table_id值为0x71。
各字段含义如下:
Syntax(句法结构) | 所占位数 | Identifier(识别符) | Note(注释) |
---|---|---|---|
running_status_section(){ | |||
table_id | 8 | uimsbf | ID标志,应该是0x71 |
section_syntax_indicator | 1 | bslbf | 段语法标志,应该是 1 |
reserved_future_use | 1 | bslbf | 未来保留位 |
reserved | 2 | bslbf | 保留位 |
section_length | 12 | uimsbf | 注释1 |
for(i=0;i < N;i++){ | |||
transport_stream_id | 16 | uimsbf | TS ID,DVB内唯一 |
original_network_id | 16 | uimsbf | 原始网络ID |
service_id | 16 | uimsbf | 节目号,和PMT内的program_number相同含义. |
event_id | 16 | uimsbf | 环境ID,同EIT定义 |
reserved_future_use | 5 | bslbf | 未来保留位 |
running_status | 3 | uimsbf | 注释2 |
} | |||
} |
注释1:
section_length:12bits段长度,单位Bytes.实际就是随后的for()循环中所有的字节数目.注释2:
running_status:3bits运行状态.0x01表示不在播放中,0x02表示即将播放,0x03表示播放被暂停,0x04表示正在正常播放,其他属于未定义状态.
以上标准SI表提供出的EPG信息是比较少的,实际上有用的EPG信息都是包含在描述符中,就是Table结构内部的descriptor()字 段 中.DVB系统提供了很多标准的descriptor(),不同的描述符展示不同的信息.具体的描述符结构请参考EN300468.
标准描述符简单介绍如下:
(1) Bouquet name descriptor:组名称描述符,提供一个组的名称符号.
(2) CA identifier descriptor:CA系统控制字描述符,提供CA的加密字.
(3) Component descriptor:组件描述符号,提供系统内所有组件的名称等信息.
(4) Content descriptor:内容描述符号,提供系统节目的内容信息(实现按内容检索功能)
(5) Country availability descriptor:有效国家列表描述符号,提供该服务允许使用的国家名称列表.
(6) Data broadcast descriptor:数据广播描述符,提供数据广播信息.
(7) Data broadcast id descriptor:数据广播标志描述符号.
(8) Cable delivery system descriptor:DVB-C传输系统参数描述符,提供DVB-C参数信息.
(9) Satellite delivery system descriptor:DVB-S传输系统参数描述符,提供DVB-S参数信息.
(10) Terrestrial delivery system descriptor:DVB-T传输系统参数描述符,提供DVB-T参数信息.
(11) Extended event descriptor:扩展环境描述符号.
(12) Frequency list descriptor:频率列表描述符,提供所有的频率信息.
(13) Linkage descriptor:可连接描述符.
(14) Local time offset descriptor:当前时间信息.
(15) Mosaic descriptor:马塞克描述符.
(16) Multilingual bouquet name descriptor:多语言代码组名称描述符.
(17) Multilingual component descriptor:多语言组件描述符号.
(18) Multilingual network name descriptor:多语言网络名称描述符.
(19) Multilingual service name descriptor:多语言服务名称描述符.
(20) NVOD reference descriptor:VOD点播参考描述符.
(21) Network name descriptor:网络名称描述符.
(22) Private data specifier descriptor:私有数据描述符.
(23) Short smoothing buffer descriptor:传输速率描述符.
(24) Service descriptor:服务器描述符,提供电视台名称和电视节目名称等信息.
(25) Service list descriptor:节目列表描述符,提供所有的节目频道号和节目类型.
(26) Service move descriptor:节目删除描述符.
(27) Short event descriptor:短消息描述符.
(28) Stream identifier descriptor:流标志描述符.
(29) Stuffing descriptor:填充数据描述符.
(30) Subtitling descriptor:子字幕描述符.
(31) Telephone descriptor:电话号码描述符.
(32) Teletext descriptor:图文信息描述符.
(33) Time shifted event descriptor:时间消逝环境描述符.
以 上 描述符结构定义在EN300468,所有的描述符都插入到不同的SI表中,因此描述符的分析应该结合不同的SI表来进行.但是这种插入又是有规律的, 如 NIT表只可能插入Terrestrial delivery system descriptor之类或 者 Network name descriptor,绝对不可能插入Service descriptor!具体插入的什么描述符,只能通过描述符的第 一个 字节descriptor_tag来判断.
因 为 EPG的实现是非常灵活的,不同的应用需要不同的EPG功能,因此在 Seekfor MPEG-2 decoder
中 没有加入EPG功能.然而实际上,EPG功能比较容易实现,但因为EPG错综复杂的SI,写EPG功能之前还是需要仔细理清思路才能实现的.
参考文章:
数字电视业务PSI/SI学习系列