数字电视业务PSI-SI学习系列

目录

1.MPEG-2简介

什么是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信息。

TS流的生成与结构

这里写图片描述
  不论是视频、音频、文字、图片还是业务信息(包括PSI/SI)都将被划分为最基本的ES,并将它们通过PES的形式组装起来,经过复用形成TS流。
这里写图片描述
  对TS流的解析:首先获取TS流中的包Packet,根据其PID过滤出需要的包,根据其section的结构还原成section,再由上层协议来处理。

ES流(ElementaryStream):基本码流,不分段的音频、视频或其他信息的连续码流。
PES流:把基本流ES分割成段,并加上相应头文件打包成形的打包基本码流。

2.DVB的分类

  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");
    }
}

3.DVB SI/PSI分析和处理

返回目录
  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值
PAT0x0000
CAT0x0001
TSDT0x0002
预留0x0003 至0x000F
NIT, ST0x0010
SDT , BAT, ST0x0011
EIT, ST0x0012
RST, ST0x0013
TDT, TOT, ST0x0014
网络同步0x0015
预留使用0x0016 至 0x001B
带内信令0x001C
测量0x001D
DIT0x001E
SIT0x001F

  上表格的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:Program Association Table,节目关联表

返回目录
  节目关联表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_id8uimsbf标志本表的类型,应该是0x00
Section_syntax_indicator1bslbf段语法标志,通常设为“1”
private_indicator1bslbf注释1
Reserved2bslbf保留位一般都是’0’
Section_length12uimsbf段大小,单位是Bytes
transport_stream_id16uimsbf当前流ID,DVB内唯一
Reserved2bslbf保留位
Version_number5uimsbf注释2
Current_next_indicator1bslbf注释3
Section_number8uimsbf当前段号码
last_section_number8uimsbf注释4
for(i=0;i < N;i++){
  program_number16uimsbf节目频道号
  reserved3bslbf
  if(program_number == 0){
     network_PID13uimsbf
  }
  else{
    program_map_PID13uimsbfPMT的PID
  }
}
CRC_3232rpchofCRC校验值,一般是会忽略的
}

各字段含义如下:

注释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:Program Map Table,节目映射表

返回目录
  节目映射表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_id8uimsbfID 应该是0x02
Section_syntax_indicator1bslbf段语法标志通常设为“1”
private_indicator1bslbfreserved_future_use 不为0则错
Reserved2bslbf保留位,应该是’00’
Section_length12uimsbf注释1
program_number16uimsbf注释2
Reserved2bslbf保留位,应该是’00’
Version_number5uimsbf注释3
Current_next_indicator1bslbf当前后续标志符,一般是0
Section_number8uimsbf当前段号码
last_section_number8uimsbf最后段号码,含义和PAT对应
reserved3bslbf保留位,一般是 ‘000’
PCR_PID13uimsbf注释4
reserved4bslbf保留位,一般是’0000’
program_info_length12uimsbf注释5
for(i=0;i < N;i++){
  descriptor()
}
for(i=0;i < N1;i++){
  stream_type8uimsbf注释6
  reserved3bslbf保留位
  elementary_PID13uimsbf注释7
  reserved4bslbf保留位
  ES_info_length12uimsbf注释8
  for(j=0;j < N2;j++){
    descriptor();
  }
}
CRC_3232rpchofCRC校验值,一般忽略
}

注释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音频
0x05private_sections
0x06包含专用数据的PES分组
0x07ISO/IEC 13533 MHEG
0x08
0x09ITU-T Rec.H.222.1
0x0A~0x0DGB/T类型
0x0EGB/T辅助
0x0F~0x7FGB/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:Conditional Access Table,条件访问表

返回目录
  条件接收表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_id8uimsbf
Section_syntax_indicator1bslbf通常设为 1
01bslbf
Reserved2bslbf
Section_length12uimsbf
reserved18bslbf
Version_number5uimsbf
Current_next_indicator1bslbf
Section_number8uimsbf
last_section_number8uimsbf
for(i=0;i < N;i++){
  descriptor()
}
CRC_3232rpchof
}

  条件存取段主要作用是指示本TS流中存在加扰节目,并且在描述符循环中必须插入CA描述符来作进一步指引。下面给出的是条件接收的描述符

Syntax(句法结构)No. ofbits(所占位数)Identifier(识别符)
CA_identifier_descriptor(){
descriptor_tag8uimsbf
descriptor_length8uimsbf
CA_system_ID16uimsbf
reserved3bslbf
CA_PID13uimsbf
for(i=0;i < N;i++){
  private_data_byte8
}
}

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:BouquetAssociation Table,业务群关联表

返回目录
  BAT即业务群关联表(Bouquet Association Table),它将网络中所有的业务分成了多个业务群,以此界定用户。例如,将网络中所有业务分为两个业务群,一个是境内节目业务群,另一个是境外节目业务群。这样,国内的运营商就可以利用这样划分的业务群,充分利用节目资源,在不违反现有广电总局规定的前提下,同时分别满足境内用户和境外用户。BAT本身可以跨网络存在,但在国内运营体系来看几乎没有得到真正使用。国内的运营使用中,BAT还可以存在分级运营的运营体系中,用于区分不同的地域用户。
  BAT被切分为业务群关联段,所有的业务群关联段都在TS中传输,其PID为0x0011。所有的业务群关联段的table_id都取0x4A。

SDT的TS包PID也为0x0011,其table_id为0x42或0x46。

BAT表的段结构:

Syntax(句法结构)No. ofbitsIdentifier(识别符)Note(注释)
bouquet_association_section(){
table_id8uimsbf0x4A
Section_syntax_indicator1bslbf通常设为1
Reserved_future_use1bslbf
Reserved2bslbf
Section_length12uimsbf注释1
bouquet_id16uimsbf注释2
Reserved2bslbf
Version_number5uimsbf注释3
Current_next_indicator1bslbf注释4
Section_number8uimsbf注释5
last_section_number8uimsbf子表的最后一个段的段号
Reserved_future_use4bslbf
bouquet_descriptors_length12uimsbf注释6
for(i=0;i < N;i++){
  descriptor()
}
reserved_future_use4bslbf
transport_stream_loop_length12uimsbf注释7
for(i=0;i < N;i++){
  transport_stream_id16uimsbf同一个传输系统中不同的复用码流
  original_network_id16uimsbf原始传输系统的network_id
  reserved_future_use4bslbf
  transport_descriptors_length12uimsbf注释8
  for(j=0;j < N;j++){
    descriptor()
  }
}
CRC_3232rpchofCRC值
}

注释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_tag8uimsbf
descriptor_length8uimsbf
for(i=0;i < N;i++){
  char8uimsbf
}
}

  char(字符):8位字段,用于描述BAT子表叙述的节目业务群名称

业务名称描述符和网络名称描述符类型,只是作为业务群的一个代号,其实际意义只存在于用户界面上,可以给用户一个良好的操作体验。

总结一下DVB搜台的原理

返回目录
  机顶盒先调整高频头到一个固定的频率(如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,服务描述表

  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_id8uimsbf注释1
Section_syntax_indicator1bslbf通常设为1
Reserved_future_use1bslbf
Reserved2bslbf
Section_length12uimsbf注释2
transport_stream_id16uimsbf当前描述的流ID
Reserved2bslbf
Version_number5uimsbf版本号码,如果数据更新则此字段递增1
Current_next_indicator1bslbf注释3
Section_number8uimsbf
last_section_number8uimsbf
original_nerwork_id16uimsbf原始网络ID号
reserved_future_use8bslbf
for(i=0;i < N;i++){N个节目信息的循环
  service_id16uimsbf注释4
  reserved_future_use6bslbf
  EIT_schedule_flag1bslbf注释5
  EIT_present_following_flag1bslbf注释6
  running_status3uimsbf注释7
  freed_CA_mode1bslbf‘1’表示该节目被加密
  descriptors_loop_length12uimsbf
  for(j=0;j < N;j++){
    descriptor()
  }
}
CRC_3232rpchof校验
}

各字段定义如下:

注释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_tag8uimsbf
descriptor_length8uimsbf
service_type8uimsbf
service_provider_name_length8uimsbf
for(i=0;i < N;i++){
  Char8uimsbf
}
service_name_length8uimsbf
for(i=0;i < N;i++){
  Char8uimsbf
}
}

业务类型:这里的业务类型和NIT中的 业务列表描述符 中的service_type编码是一致的:

service_type描述
0x00预留使用
0x01数字电视业务
0x02数字音频广播业务
0x03图文电视业务
0x04NVOD参考业务
0x05NVOD时移业务
0x06马赛克业务
0x07PAL制编码信号
0x08SECAM制编码信号
0x09D/D2-MAC
0x0A调频广播
0x0BNTSC制信号
0x0C数据广播业务
0x0D公共接口使用预留
0x0ERCS映射(见EN 301 790)
0x0FRCS FLS(见EN 301 790)
0x10DVB MHP业务
0x11~0x7F预留使用
0x80~0xFE用户定义
0xFF预留使用

  业务描述符是SDT中最重要的描述符,也是运营商中必须的描述符。其中的service_type描述这个业务类型的域;service_name描述频道名。

  至此分析完毕,节目名称和节目号码已经联系起来了.机顶盒程序就可以用这些节目名称代 替 PID让用户选择,从而实现比较友好的用户界面。
PSI/SI深入学习3——SI信息解析2(SDT, EIT, TDT,TOT)

4.EPG原理

  EPG就 是“电子节目指南”,相当于一个节目菜单的功能.在一个TS流中,可以提供当前流的所有信息,如频率,调制方式,频道号,所有节目的PID,名称等信息, 也可以根据需要提供其他相关联的TS流(例如同一电视台同步播放的其他频率的节目信息)的信息.解码器接收这些信息,形成一个固定格式的菜单让用户选择需要收看的频道或节目,这就是”EPG”.不仅如此,EPG还可以对节目进行分类,比如节目可以是电影,也可以是新闻,这样,把属于电影的节目归在一 起,把 属于新闻的节目归在一起,这样对用户来说检索节目就变得非常的方便.

  EPG的实现也归功于DVB的SI信息.和EPG功能相关的SI有NIT(网络信息表),EIT(环境信息表),SDT(服务描述表),BAT(群组关联表),TDT(日期时间表)和TOT(时间偏移表).下面简单分析这些表所携带的信息.NIT,Network Information Table,网络信息表NIT提供如网络名称(相当于电视台名称),传输参数(如频率,调制方式等).这个表格一般是解码器内部使用的数据,当然也可以做为EPG的一个显示数据提供给用户做为参考.

NIT: Network Information Table,网络信息表

返回目录
  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_id8uimsbf注释0
Section_syntax_indicator1bslbf通常设为 1
Reserved_future_use1bslbf保留未来使用位,一般是 0
Reserved2bslbf一般是’00’,防止控制字冲突而设置
Section_length12uimsbf注释1
Network_id16uimsbf注释2
Reserved2bslbf保留意见位
Version_number5uimsbf注释3
Current_next_indicator1bslbf当前下次使用标志,一般是’0’
Section_number8uimsbf当前段号码
last_section_number8uimsbf见注释
Reserved_future_use4bslbf未来使用,应该是’0000’.
Network_descriptors_length12uimsbf网络描述符长度,字节单位
for(i=0;i < N;i++){N个不同的描述符结构
  descriptor()//First descriptor loop注释4
}
reserved_future_use4bslbf保留位,当前应是’0000’
transport_stream_loop_length12uimsbf随后的循环的字节总数
for(i=0;i < N;i++){
  transport_stream_id16uimsbf
  original_network_id16uimsbf注释5
  reserved_future_use4bslbf
  transport_descriptors_length12uimsbf随后的N个描述符占用的字节总数
  for(j=0;j < N;j++){
     descriptor()//Second descriptor loop 注释6
  }
}
CRC_3232rpchof整个段的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流,如插入有线传输系统描述符 。

NIT的业务列表描述符结构分析

ANALYZE OF THE STRUCTURE OF SERVICE_LIST_DESCRIPTOR IN NIT
返回目录
  业务列表描述符通过业务标识符和业务类型提供业务服务。其目的在于:告诉接收机每一个TS流中存在多少个业务以及每一个业务的类型。其结构如下:

Syntax(句法结构)No. ofbits(所占位数)Identifier(识别符)
service_list_descriptor(){
descriptor_tag8uimsbf
descriptor_length8uimsbf
for(i=0;i < N;i++){
  service_id16uimsbf
  service_type8uimsbf
}
}

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定义是完全一致的。

NIT的有线传输系统描述符结构分析

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_tag8uimsbf
descriptor_length8uimsbf
frequency32bslbf
reserved_future_use12bslbf
FEC_outer4bslbf 前向纠错外码
modulation8bslbf
symbol_rate28bslbf
FEC_inner4bslbf 前向纠错内码
}

Frequency(频率):32位,以8个4位BCD码给出频率。其单位是MHz,小数点位于第四个BCD码之后,如0312.0000MHz。
Modulation(调制方式):指出有线传输系统的调制方式。其定义如下表:

调制方式(十六进制)描述
0x00未定义
0x0116 QAM
0x0232 QAM
0x0364 QAM
0x04128 QAM
0x05256 QAM
0x06~0xFF预留使用

symbol_rate(符码率):28位,以7个4位BCD码表示符码率。其单位是MSPS(兆符号每秒),小数点位于第三个BCD码后,如027.4500 MSPS

NIT的网络名称描述符结构分析

ANALYZE OF THE STRUCTURE OF NETWORK_NAME_DESCRIPTOR IN NIT
返回目录
  网络名称描述符的功能比较简单,它以字符串的形式将网络的名称告诉接收机。下面是其描述符结构列表:

Syntax(句法结构)No. ofbits(所占位数)Identifier(识别符)
network_name_descriptor(){
descriptor_tag8uimsbf
descriptor_length8uimsbf
for(i=0;i < N;i++){
  char8uimsbf
}
}

  char(字符):8位字段,一个字符串,给出NIT表指定的传送系统的名称。

NIT的链接描述符结构分析

ANALYZE OF THE STRUCTURE OF LINKAGE_DESCRIPTOR IN NIT
返回目录

Syntax(句法结构)No. ofbits(所占位数)Identifier(识别符)
linkage_descriptor(){
descriptor_tag8uimsbf
descriptor_length8uimsbf
transport_stream_id16uimsbf
original_network_id16uimsbf
service_id16uimsbf
linkage_type8uimsbf
for(i=0;i < N;i++){
  private_data_byte8bslbf
}
}

  如果用户要求得到SI系统描述的特定实体的进一步信息,则可以使用链接描述符。链接描述符包含的信息给出了该实体的位置。如:可以在一个NIT中使用一个链接描述符,给出网络中可存放业务附加信息的位置;或者在BAT表中的链接描述符可链接到业务群的相关信息等。
  使用链接描述符,也可以提供一种业务,以替换CA系统的功能。如果CA系统不能处理相应功能的时候,接收机就可以用这个业务来取代CA。
  使用链接描述符,还可以以一种备用业务,用以替换主业务。若主业务的运行状态被置为“not_running”,那么,接收机可以自动选择被链接描述符指引的备用业务,以取代该业务。
  使用链接描述符,还可以向移动接收机提供漫游功能。若现行业务其service_id下无法使用,IRD可以自动选择该功能。hand-over_type指明link_descriptor是否链接到不同国家的同一业务,或者链接到本地变更业务或关联业务。
  总之,链接描述符为运营商提供了一种业务扩充功能,使得运营商可以更加灵活地组合各种业务。

EIT : Event Information Table,事件信息表

返回目录
  事件信息表提供如下信息:节目段的标识号、起始时间、节目长度、播放状态、是否加密;指向特定信息的链接信息;节目段多语种的简短介绍;节目段的详细介绍;两段同样节目段的时间偏移;基本码流类型,如视频的幅型比、伴音的类型、字幕的类型等;使用的加密系统;节目类型,如电影/戏剧、新闻、综艺、体 育、少 儿、音乐、艺术、社会政治、文教等;节目限定年龄的级别;给出实现交互式回传信道的电话号码;为满足各节目段的码率而提供的缓存大小信息及私有数 据等。是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_id8uimsbf
Section_syntax_indicator1bslbf通常设为 1
Reserved_future_use1bslbf
Reserved2bslbf
Section_length12uimsbf见注释
service_id16uimsbf与PAT中的 program_number 一致
Reserved2bslbf
Version_number5uimsbf见注释
Current_next_indicator1bslbf见注释
Section_number8uimsbf见注释
last_section_number8uimsbf见注释
transport_stream_id16uimsbf见注释
original_nerwork_id16uimsbf见注释
segment_last_section_number8uimsbf见注释
last_table_id8uimsbf见注释
for(i=0;i < N;i++){
  event_id16uimsbf事件(节目)id
  start_time40bslbf事件(节目)开始时间
  duration24bslbf事件(节目)持续始时间
  running_status3uimsbf见注释
  freed_CA_mode1bslbf见注释
  descriptors_loop_length12uimsbf
  for(j=0;j < N;j++){
    descriptor()
  }
}
CRC_3232rpchof见注释
}

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的描述符中获取了。

EIT的短事件描述符分析

ANALYZE OF THE STRUCTURE OF SHORT_EVENT_DESCRIPTOR IN EIT
返回目录
  短事件描述符(Short_event_descriptor)以文本方式提供了事件名称和该事件的简短描述。描述符结构如下:

Syntax(句法结构)No. ofbits(所占位数)Identifier(识别符)
short_event_descriptor(){
descriptor_tag8uimsbf
descriptor_length8uimsbf
ISO_639_language_code24bslbf
event_name_length8uimsbf
for(i=0;i < event_name_length;i++){
  event_name_char8uimsbf
}
text_length8uimsbf
for(i=0;i < text_length;i++){
  text_char8uimsbf
}
}

  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(文本字符):一个字符串给出事件的文本描述。

EIT的扩展事件描述符分析

返回目录
ANALYZE OF THE STRUCTURE OF EXTENDED_EVENT_DESCRIPTOR IN EIT
  扩展事件描述符(Extended_Event_Descriptor)扩展事件描述符给出了一个事件的详细文本描述。如果一个事件的信息长度超过256字节,可以使用多于一个相关联的扩展事件描述符来描述。文本信息可以分为两个栏目,一栏为条目的描述,另一栏为条目的内容。

Syntax(句法结构)No. ofbits(所占位数)Identifier(识别符)
extended_event_descriptor(){
descriptor_tag8uimsbf
descriptor_length8uimsbf
descriptor_number4uimsbf
last_descriptor_number4uimsbf
ISO_639_language_code24bslbf
length_of_items8uimsbf
for(i=0;i < N;i++){
  item_description_length8uimsbf
  for(j=0;j < N;j++){
    item_description_char8uimsbf
  }
  item_length
  for(j=0;j < N;j++){
    item_char
  }
}
text_length
for(i-0;i < N;i++){
  text_char
}
}

RST:Running Status Table,运行状态表

返回目录
  运行状态表(RST)能准确而迅速地的更新一个或多个事件的时间状态。因为时间表的变化,事件的开始可能提前或滞后,所以RST表的存在是非常必要的。使用一个独立的表可以保证快速更新机制的实现。
  RST表被切分成运行状态段。任何构成RST表的段,都要由PID为0x0013的TS包传输,table_id值为0x71。

各字段含义如下:

Syntax(句法结构)所占位数Identifier(识别符)Note(注释)
running_status_section(){
table_id8uimsbfID标志,应该是0x71
section_syntax_indicator1bslbf段语法标志,应该是 1
reserved_future_use1bslbf未来保留位
reserved2bslbf保留位
section_length12uimsbf注释1
for(i=0;i < N;i++){
  transport_stream_id16uimsbfTS ID,DVB内唯一
  original_network_id16uimsbf原始网络ID
  service_id16uimsbf节目号,和PMT内的program_number相同含义.
  event_id16uimsbf环境ID,同EIT定义
  reserved_future_use5bslbf未来保留位
  running_status3uimsbf注释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学习系列

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值