|
关于psi介绍[转]
转载一篇PSI/SI 分析的好文 一、MPEG-2系统原理 &n bsp; &nbs p; 第一* MPEG-2简介 什么是MPEG和MPEG-2? MPEG是Moving <a href="http://www.webearphone.com/products_new.html"><strong>monster beats dr dre</strong></a> Picture Experts Group 的简称,MPEG-2是MPEG和ISO组织设计的一个数*视频压 缩规范,主要用于DVD和DVB上,当前的*准 文档是ISO13818. 什么是DVB? DVB是Digtal Video Broadcast的简称,是欧洲所有国家和其他 分国家和地区使用的数*电视*准. *美国的ATSC*准也是在DVB*准的基础 上实现的. 什么是TS*流和PS流? TS是transport stream的简称,就是”*输流”.DVB 据广*采用的数据*式就是TS*流. PS是program stream的简称,就是”节目流”.DVD *采用的数据*式就是PS流. 这两种流的*式是不同的,TS*式具有 强的错误**功能,适合*输,而PS*式 适合*储在媒体*. 在这里,着重描述的是TS*流*式. 什么是PID? PID是Packet identification的简称,就是”包*志符& rdquo;.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的简称,即”节目关联表”.PA T属于DVB系统流*的一个包,包号*(PID) 0x00.PAT表描述了DVB系统流*包含什么 *的PID,主要是描述当前流的NIT表*的PI D号*是多少,当前流*有多少个不同类 型PMT表,每个PMT表对应的频道号*信息. 什么是PMT? PMT是Program Map Table的简称,即”节目影射表”.PM T的PID 是服务器自由定义的(但不会和系统保 的PID冲突).这个PID是在PAT表*描述的, 比如,如果在PAT表*有0x100项的内容,那 说明所有 PID是0x100的包都是PMT表.不同的频道有 同的PMT,也就是说,一个不同的PMT代表 是一个不同频道.PMT表*和PAT表*配合 在一起, 就可以检测出DVB流*所有*在节目的 有PID,**,数*电视搜台就是依*这 个表*数据完成的. 什么是CAT? CAT是Conditional Access Table的简称,即”条件访问表”,PI D是0x01.CAT携带的是服务器的私有信息(C A系统就需要使用该表*实现节目的解 ). 什么是SDT? SDT是Service Description Table的简称,即”服务器描述表” ,PID是0x11.SDT携带的是电视台名称和电 节目名称.DVB接收系统接收SDT表*的节 目信息,实现比较友好的界面显示和操 . 什么是NIT和EIT? NIT是Network Information Table的简称,即”网络信息表”. EIT是Event Information Table的简称,即”环境信息表”. NIT可以提供当前流的节目信息,也可以 供和当前流有关联的流的节目信息. EIT提供的是流节目信息的改变,比如一 节目已经开始,或者已经结束的信息* . 什么是EPG? EPG是Electronic Programme Guides的简称,即”电*节目指南&rdquo ;.该功能可实现预告近段时间即将*放 的节目内容,同时支持基于内容的检索. 什么是teletext? Teletext就 是我们常说的”图文电视”,当 在MPEG-2*,图文电视已经数*化,也就是说,图 信息已经做为数*化信息在TS流** *.但最终,数*化的图文信息 都将转化为模拟的VBI信息插入到*常 电视信号*实现图文电视的显示.图文 电视有很多*准,比如close caption,WSS*,欧洲的DVB使 用的teletext*准是ITU-R System B Teletext规*.该规*支持欧洲多种*言, 持简单图象和文本的混合显示. &n bsp; &nbs p; 第二* DVB系统的构成 [本文不详细描述DVB系统的硬件构成,只 *据ISO13818*的描述,详细解释TS*流 *式和解复用原理.(够了,够了 呵呵)] 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系统,同时*为美国的ATS C系统也是在DVB系统上的小量更改和小 分功能增*,**也适用于 ATSC*准. 基本系统描述如下: (1)编*系统: 假 设信号源有6个节目,则DVB系统先对这6 节目的所有数据(Video,Audio)进行压缩处 理,然后经过一个叫做"复用"的 序进行节目的复用 (PID分配,即对6个节目分别分配不同的PI D号*)形成叫做"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*式都是统一的,包括一个P acket header和Packet datas.其*Packet header包含了同**节(该*节固定是0x47 ,表示这个包的数据开始是*确的),该Pa cket的唯一号*(即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,那么说明这个P acket是DVB的PAT表*而不是 Video数据或者Audio数据. 实 际上,在信号编*成TS*流的时候,不同 目的Video,Audio*数据都分配了不同的P ID.例如,一个节目有两路Video,三路Audio, 么分配PID的时候可能是Video 1==0x100,Video 2==0x101,Audio 1==0x102,Audio 2==0x103, Audio 3==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"); } } 现 在的问题是,编*的时候分配好的PID,在 解*的时候是怎么知道什么PID对应什 数据呢?这就是DVB SI表*的分析与处理了,请参考第三*. 里先 看一个实际的TS*流的例*.这里的数 是用UltraEdit用16进制*式打开TS*流文 件得到的.文件是Taiwan-551.ts. 这 <a href="http://www.webearphone.com/monster-headphones-c-052.html"><strong>monster beats headphone</strong></a> 里仅仅截取了3个Packet的信息,请注意图 *用红色*注的部分,这就是TS流Packet 4个*节的头信息.这个TS流是采用每个 包共188*节的 *式,*为两个头信息的间隔是188个* (第一个0x47到第二个0x47的间隔).以后 所有的Packet都将是188*节的*式,这 DVB TS*准规定的固定大小.那么这三个包 别包含的是什么数据,下面我们可以自 己分析一下. 先 看第一个包,头信息数据是"0x47 0x07 0xe5 0x12",刚才已经知道了,header信息都 按位操作的(这就是为什么TS*流也可 叫 做位流的原*),特别要注意的是定义和 *输的时候都是MSB first,也就是说,先出现的位是数据的最 位.先转化成2进制*式: 01000111 00000111 11100101 00010010 请对照上面的PACKET_HEADER结构: typedef struct { unsigned sync_byte:8; unsigned transport_error_indicator:1; unsigned payload_unit_start_indicator:1; unsigned transport_priority:1; unsigned PID:13; unsigned transport_scrambling_control:2; unsigned adaptation_field_control:2; unsigned continuity_counter:4; }PACKET_HEADER; 那么对照一下,我们可以发现: sync_byte=01000111,就是0x47,这是DVB TS规定的同**节,固定是0x47. transport_error_indicator=0,表示当前包没有 生*输错误. payload_unit_start_indicator=0,含义请参考ISO1 3818-1*准文档 transport_priority=0,表示当前包是低优先 . PID=00111 11100101即0x07e5,这代表是什么呢,暂时还 知道(实际上是Video PID,参考下图) transport_scrambling_control=00,表示节目没有 *密 adaptation_field_control=01即0x01,具体含义请 参考ISO13818-1 continuity_counte=0010即0x02,表示当前*送 相同类型的包是第3个 依*类推,再看一下第二个包"0x47 0x07 0xe5 0x13",2进制是01000111 00000111 11100101 00010011 sync_byte=01000111,就是0x47,这是DVB TS规定的同**节,固定是0x47. transport_error_indicator=0,表示当前包没有 生*输错误. payload_unit_start_indicator=0,含义请参考ISO1 3818-1*准文档 transport_priority=0,表示当前包是低优先 . PID=00111 11100101即0x07e5,这代表是什么呢,暂时还 知道(实际上是Video PID,参考下图) transport_scrambling_control=00,表示节目没有 *密 adaptation_field_control=01即0x01,具体含义请 参考ISO13818-1 continuity_counte=0011即0x03,表示当前*送 相同类型的包是第4个(注意到了吧,以 两个包的PID都是0x07e5,所以这里的conti nuity_counte就递增一次) 第三个包是"0x47 0x07 0xf1 0x18",2进制是01000111 00000111 11110001 00011000. sync_byte=01000111,就是0x47,这是DVB TS规定的同**节,固定是0x47. transport_error_indicator=0,表示当前包没有 生*输错误. payload_unit_start_indicator=0,含义请参考ISO1 3818-1*准文档 transport_priority=0,表示当前包是低优先 . PID=00111 11100101即0x07f1,这代表是什么呢,暂时还 知道(实际上是Audio PID,参考下图) transport_scrambling_control=00,表示节目没有 *密 adaptation_field_control=01即0x01,具体含义请 参考ISO13818-1 continuity_counte=1000即0x08,表示当前*送 相同类型的包是第9个 请看解*程序<<Seekfor <a href="http://www.webearphone.com/bose-headphones-c-02.html"><strong>bose headphones</strong></a> MPEG-2 decoder>>读取该文件的结果: 上图我们可以发现,Taiwan-551.ts有一个节目叫"DIMO",它的Vid eo PID是0x07e5,Audio PID是0x07e6 还有一个节目叫"Service 1",没有Video PID,它的Audio PID是0x07f1(说明是一个广*节目而非电 节目) 这个数据刚好和我们刚才的分析是吻 的. 但 是我想大家还有疑问,为什么0x07e5代表V ideo PID,0x07e6代表其*一个Audio PID呢?这就是刚才提到的,这是TS流在编 *的 时候就分配好了的.但是,在解*的时候 是怎么知道0x07e5就代表的是Video而不是 Audio呢?这就是第三*的内容:DVB SI/PSI分析和 处理. &n bsp; &nbs p; 第三* DVB SI/PSI分析和处理 SI是Specific Information的简称,PSI是program Specific Information.该机制允许DVB*送各种 各*的讯息,比如节目名称,电视台 称,各种PID,私有信息,甚至单 *送数据实现数据通信*.这些功能 的实现都归功于SI/PSI. 在DVB *准*,定义了一个*准的PID用来实 SI/PSI.这些PID是系统保留的,**DVB *的时候并不会用这些PID做为Vid eo PID或者 Audio PID或者其他PID.在一个简单的解 用程序*,只需要提供处理PAT,PMT表* 的程序即可实现解复用,当然如果需 更友好的界面和实现 更复杂的功能(如CA)则必须处理 他的SI表.在这里仅仅分析PAT,PMT,SD T表*,其他SI表*的分析,请参考ISO13 818-1(MPEG-2系统层*准)和EN300468(DVB SI*准)文档. DVB定义的SI保留的PID分别是: 上表*的PID就是DVB保留的PID 分配的其他PID一定不会*用这些 ID.解复用程序需要使用到的表* 只有PAT,PMT,SDT,而CA应用还需要使用CA T,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,P MT和SDT三类表*的*式. PAT, Program Association Table,节目关联表 PAT表携带以下信息: (1) TS流ID--- transport_stream_id,该ID*志唯一的流I D (2) 节目频道号-- program_number,该号**志TS流*的一 频道,该频道可以包含很多的节目(即 可以包含多个Video PID和Audio PID) (3) PMT的PID--- program_map_PID,表示本频道使用的哪个PID 为PMT的PID,*为可以有很多的频 道,**DVB规定PMT的PID可以由用 自己定义. PAT表定义如下: 各*段含义如下: table_id:8 bits,*志本表*的类型,应该是0x00 section_syntax_indicator:1 bit,段*法*志,应该是'1' '0':固定的'0',这是为了防*和ISO13818Vi deo流*式*的控制*冲突而设置的. Reserved:保留的2bits,保留位一般都是'0' section_length:12bits的段大小,单位是Bytes . transport_stream_id:16bits的当前流ID,D VB内唯一.(事实上很多都是自定义的 TS ID) version_number:5bits版本号*,*注当前节 目的版本.这是个非常有用的参数, 检测到这个*段改变时,说明TS流 *的节目已经变化了,程序必须重新搜 索节目. current_next_indicator:1bit:当前还是未来使 *志符,一般情况下为'0' section_number:8bits当前段号* last_section_number:8bits最后段号*(section_n umber和last_section_number的功能是当PAT内 >184*节时,PAT表会分成多个段(secti ons),解复用程序必须在全部接收完成后 再进行PAT的分析) 从for()开始,就是描述了当前流*的频 道数目(N),每一个频道对应的PMT PID是什么.解复用程序需要和上图类 的循环来接收所有的频道号*和对应 PMT PID,并把这些信息在缓冲区*保*起来 在后部的处理*需要使用到PMT PID. CRC_32:本段的CRC*验值,一般是会忽略 .N是一个变量,计算方法是N=(section_ length-9)/4. 从以上分析我们可以发现,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,节目影射表 如果一个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表*包含的数据如下: (1) 当前频道*包含的所有Video数据的PID (2) 当前频道*包含的所有Audio数据的PID (3) 和当前频道关联在一起的其他数据的PI D(如数*广*,数据通讯*使用的PID) PMT定义如下: 各*段含义如下: table_id:8bits的ID,应该是0x02 section_syntax_indicator:1bit的段*法*志, 该是'1' '0':固定是'0',如果不是说明数据有错. reserved:2bits保留位,应该是'00' section_length:16bits段长度,从program_number 始,到CRC_32(包含)的*节总数. program_number:16bits的频道号*,表示当前 PMT关联到的频道.换句话就是说,当前 述的是program_number频道的信息. reserved:2bits保留位,应该是'00' version_number:版本号*,如果PMT内容有更 ,则version_number会递增1通知解复用程 需要重新接收节目信息,否则version_numb er是固定不变的. current_next_indicator:当前未来*志符,一 是0 section_number:当前段号* last_section_number:最后段号*,含义和PAT *的对应*段相同,请参考PAT部分. reserved:3bits保留位,一般是'000'. PCR_PID:13bits的PCR PID,具体请参考ISO13818-1,解复用程序不使用该参数. reserved:4bits保留位,一般是'0000' program_info_length:节目信息长度(之后的 N个描述符结构,一般可以忽略掉,这个 *段就代表描述符总的长度,单位是Bytes ) 紧接着就是频道内部包含的节目类型 对应的PID号*了. stream_type:8bits流类型,*志是Video还是Aud io还是其他数据. reserved:3 bits保留位. elementary_PID:13bits对应的数据PID号*(如 stream_type是Video,那么这个PID就是Video PID,如果stream_type*志是Audio,那么这个PI D就是Audio PID) reserved:4 bits保留位. ES_info_length:和program_info_length类似的信 长度(其后是N2个描述符号) CRC_32:32bits段末尾是本段的CRC*验值,一 般忽略. 从以上的分析可以看出,只要我们处理 PMT,那么我们就可以获取频道*所有 PID信息,例如当前频道包含多少个Video, 共多少个Audio,和其他数据,还能知道每 数据对应的PID分别是什么. 这*如果我们要选择其*一个Video和Aud io收看,那么只需要把要收看的节目的Vi deo 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是一个Vid eo <a href="http://www.jolintsai.net/forum/viewtopic.php?p=1069481#1069481"><strong>A Review of the Farouk CHI Flat Iron – Is it any good? | Best Flat ...</strong></a> Packet*/ { SaveToVideoBuffer(buff+4);/*保*到Video缓冲区*/ } else if(PID==Audio_PID)/*和Audio_PID相*,说明当前Packet是一个Aud io 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,选择 定的节目进行*放.只要读取每个Packe t的188*节的内容,然后每次都调用Proces s_Packet()即可实现简单的解复用. 介绍到这里,我们就可以总结一下DVB搜 的原理了.(好!洗耳*听!) 机 顶盒先调整高频头到一个固定的频率( 498MHZ),如果*频率有数*信号,则COFDM 片(如MT352)会自动把TS流数据*送给MPE G- 2 decoder. MPEG-2 decoder先进行数据的同*,也就是*待完 整的Packet的到来.然后循环查找是否出 PID== 0x0000的Packet,如果出现了,则马上进入分 析PAT的处理,获取了所有的PMT的PID.接着 循环查找是否出现PMT,如果发现了,则自 动进 入PMT分析,获取该频段所有的频道数据 保*.如果没有发现PAT或者没有发现PM T,说明该频段没有信号,进入下一个频 扫描. 从以上描述可以看出,机顶盒搜索频率 随机发生的,要使每次机顶盒都能搜 到信号,则要求TS流每隔一段时间就发 一次PAT和PMT.事实上DVB*输系统就是 么做的.***论何时接入终端系统, 统都能马上搜索到节目并*确解复用 现*放.不仅仅如*,其他数据也都是 替*送的.比如第一个Packet可能是PAT, 二个Packet可能是PMT,而第三个Packet可 是Video 1,第四个Packet可能是Video 2, 只要系统*输速度足够快(就是称之为& quot;*率"的东东),实现实时*放是 有任何问题的. 到这里虽然实现了解复用,但可以看出, 使用的PID都是枯燥的数*,如果调台要 户自己输入数*那可是太麻烦了,而 还容易输入错误,操作非常不直观,即 做成一个菜单让用户选择也是非常的 板.针对这个问题,DVB系统提出了一个S DT表*,该表**志一个节目的名称,并 能和PMT*的PID联系起来,这*用户就 以通过直接选择节目名称来选择节目 . SDT, Service description section,服务描述段 SDT可以提供的信息包括: (1) 该节目是否在*放* (2) 该节目是否被*密 (3) 该节目的名称 SDT定义如下: 各*段定义如下: table_id:8bits的ID,可以是0x42,表示描述的 当前流的信息,也可以是0x46,表示是其 他流的信息(EPG使用*参数) section_syntax_indicator:段*法*志,一般是 '1' reserved_future_used:2bits保留未来使用 reserved:1bit保留位,防*控制*冲突,一 是'0',也有可能是'1' section_length:12bits的段长度,单位是Bytes, transport_stream_id开始,到CRC_32结束(包含 ) transport_stream_id:16bits当前描述的流ID reserved:2bits保留位 version_number:5bits的版本号*,如果数据 新则**段递增1 current_next_indicator:当前未来*志,一般 '0',表示当前马上使用. original_netword_id:16bits的原始网络ID号 reserved_future_use:8bits保留未来使用位 接下来是N个节目信息的循环: service_id:16 bits的服务器ID,实际上就是PMT段*的prog ram_number. reserved_future_used:6bits保留未来使用位 EIT_schedule_flag:1bit的EIT信息,1表示当前 实现了该节目的EIT*送 EIT_present_following_flag:1bits的EIT信息,1表 当前流实现了该节目的EIT*送 running_status:3bits的运行状态信息:1-还未*放 2-*分钟后马上开始,3-被暂停*出,4-*在*放,其他---保留 free_CA_mode:1bits的*密信息,'1'表示该节 被*密. 紧 接着的是描述符,一般是Service descriptor,分析*描述符可以获取servive_i d指定的节目的节目名称.具体*式请参 考 EN300468*的Service descriptor部分.分析完毕,则节目名称和 目号*已经联系起来了.机顶盒程序就 可以用这些节目名称代替 PID让用户选择,从而实现比较友好的用 界面! 下面参考一下<<Seekfor MPEG2 decoder>>*的界面和显示信息. 上 图是<<Seekfor MPEG2 decoder>>打开三个不同的*流文件(* .ts)形成的PID信息和节目名称.用户 可以通过切换节目名称的下拉列表框 换节目,也可以通过"视频流"和 "音频流"下拉列表框切换Video和 Audio!这些数据都是通过分析PAT, PMT和SDT得到的.
|