Quick Search


Tibetan singing bowl music,sound healing, remove negative energy.

528hz solfreggio music -  Attract Wealth and Abundance, Manifest Money and Increase Luck



 
Your forum announcement here!

  Free Advertising Forums | Free Advertising Board | Post Free Ads Forum | Free Advertising Forums Directory | Best Free Advertising Methods | Advertising Forums > Post Your Free Ads Here in English for Advertising .Adult and gambling websites NOT accepted. > Post Your Products & Services Here

Post Your Products & Services Here This section is for posting your free classified ads about new products and services, software, ebooks, and more.

 
 
Thread Tools Display Modes
Prev Previous Post   Next Post Next
Old 07-29-2011, 04:02 AM   #1
nathalg5ivo
 
Posts: n/a
Thumbs up 关于psi介绍[转]

转载一篇PSI/SI 分析的好文 一、MPEG-2系统原理 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 第一* MPEG-2简介 什么是MPEG和MPEG-2? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 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流? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TS是transport stream的简称,就是&rdquo;*输流&rdquo;.DVB 据广*采用的数据*式就是TS*流. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PS是program stream的简称,就是&rdquo;节目流&rdquo;.DVD *采用的数据*式就是PS流. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这两种流的*式是不同的,TS*式具有 强的错误**功能,适合*输,而PS*式 适合*储在媒体*. 在这里,着重描述的是TS*流*式. 什么是PID? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PID是Packet identification的简称,就是&rdquo;包*志符& rdquo;.DVB系统把不同的数据打包成不同 数据包,用系统唯一的一个13 bits数**志该数据的类型.例 如,PID=0x00表示是DVB系统*的PAT包,而PID= 0x10表示是DVB系统的NIT包.不同的节目( 括Video和Audio)分别采用 不同的PID,例如,我们在PMT表*如果检测 到PID=0x0120的PID是VIDEO数据,那么表示包 *是0x0120的所有包都是Video数 据,其他依*类推. 什么是PAT? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PAT是Program Association Table的简称,即&rdquo;节目关联表&rdquo;.PA T属于DVB系统流*的一个包,包号*(PID) 0x00.PAT表描述了DVB系统流*包含什么 *的PID,主要是描述当前流的NIT表*的PI D号*是多少,当前流*有多少个不同类 型PMT表,每个PMT表对应的频道号*信息. 什么是PMT? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PMT是Program Map Table的简称,即&rdquo;节目影射表&rdquo;.PM T的PID 是服务器自由定义的(但不会和系统保 的PID冲突).这个PID是在PAT表*描述的, 比如,如果在PAT表*有0x100项的内容,那 说明所有 PID是0x100的包都是PMT表.不同的频道有 同的PMT,也就是说,一个不同的PMT代表 是一个不同频道.PMT表*和PAT表*配合 在一起, 就可以检测出DVB流*所有*在节目的 有PID,**,数*电视搜台就是依*这 个表*数据完成的. 什么是CAT? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CAT是Conditional Access Table的简称,即&rdquo;条件访问表&rdquo;,PI D是0x01.CAT携带的是服务器的私有信息(C A系统就需要使用该表*实现节目的解 ). 什么是SDT? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SDT是Service Description Table的简称,即&rdquo;服务器描述表&rdquo; ,PID是0x11.SDT携带的是电视台名称和电 节目名称.DVB接收系统接收SDT表*的节 目信息,实现比较友好的界面显示和操 . 什么是NIT和EIT? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NIT是Network Information Table的简称,即&rdquo;网络信息表&rdquo;. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EIT是Event Information Table的简称,即&rdquo;环境信息表&rdquo;. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NIT可以提供当前流的节目信息,也可以 供和当前流有关联的流的节目信息. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EIT提供的是流节目信息的改变,比如一 节目已经开始,或者已经结束的信息* . 什么是EPG? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EPG是Electronic Programme Guides的简称,即&rdquo;电*节目指南&rdquo ;.该功能可实现预告近段时间即将*放 的节目内容,同时支持基于内容的检索. 什么是teletext? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Teletext就 是我们常说的&rdquo;图文电视&rdquo;,当 在MPEG-2*,图文电视已经数*化,也就是说,图 信息已经做为数*化信息在TS流** *.但最终,数*化的图文信息 都将转化为模拟的VBI信息插入到*常 电视信号*实现图文电视的显示.图文 电视有很多*准,比如close caption,WSS*,欧洲的DVB使 用的teletext*准是ITU-R System B Teletext规*.该规*支持欧洲多种*言, 持简单图象和文本的混合显示. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 第二* 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)进行压缩处 理,然后经过一个叫做&quot;复用&quot;的 序进行节目的复用 (PID分配,即对6个节目分别分配不同的PI D号*)形成叫做&quot;PES&quot;的包,然后 经过TS流处理程序,把这些PES包全部封 成TS*流*式,最后 把获得的TS*式的数*信号经过调制( 现的是频率的复用),然后经过D/A转换成模拟信号,再次调制成高频信号 ,经*输系统发送出去. (2)解*系统 接 收系统接收到高频信号,先转化为*频 号,然后再经过一个高速的A/D转换成数*信号,接着经过一个反调制 程序,这*就得到了TS*流. TS*流进入一 个称为&quot;解复用&quot;的程序,该程序 现自动分析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流组成如下所示: &nbsp;&nbsp;&nbsp; Packet 1&nbsp;&nbsp;&nbsp;&nbsp; Packet 2&nbsp;&nbsp;&nbsp; ......&nbsp;&nbsp;&nbsp; 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数据*/ { &nbsp;&nbsp; SaveToVideoBuffer(buff+4);/*把header后部的数据*到Video缓冲区,待 部处理*/ } else if(PID==0x103)/*PID*于第二路Audio的PID,说明当前数据 Audio数据*/ { &nbsp;&nbsp; SaveToAudioBuffer(buff+4);/*把header后部的数据*到Audio缓冲区*/ } else/*其他PID则丢弃,当然如果PID是DVB系统保 留的PID如PAT,PMT则必须处理*/ { &nbsp;&nbsp; printf(&quot;unknown PID!n&quot;); }&nbsp;&nbsp;&nbsp; } 现 在的问题是,编*的时候分配好的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*准规定的固定大小.那么这三个包 别包含的是什么数据,下面我们可以自 己分析一下. 先 看第一个包,头信息数据是&quot;0x47 0x07 0xe5 0x12&quot;,刚才已经知道了,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个 依*类推,再看一下第二个包&quot;0x47 0x07 0xe5 0x13&quot;,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就递增一次) 第三个包是&quot;0x47 0x07 0xf1 0x18&quot;,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个 请看解*程序&lt;&lt;Seekfor <a href="http://www.webearphone.com/bose-headphones-c-02.html"><strong>bose headphones</strong></a> MPEG-2 decoder&gt;&gt;读取该文件的结果: 上图我们可以发现,Taiwan-551.ts有一个节目叫&quot;DIMO&quot;,它的Vid eo PID是0x07e5,Audio PID是0x07e6 还有一个节目叫&quot;Service 1&quot;,没有Video PID,它的Audio PID是0x07f1(说明是一个广*节目而非电 节目) 这个数据刚好和我们刚才的分析是吻 的. 但 是我想大家还有疑问,为什么0x07e5代表V ideo PID,0x07e6代表其*一个Audio PID呢?这就是刚才提到的,这是TS流在编 *的 时候就分配好了的.但是,在解*的时候 是怎么知道0x07e5就代表的是Video而不是 Audio呢?这就是第三*的内容:DVB SI/PSI分析和 处理. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第三* 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分别是: &nbsp;&nbsp; 上表*的PID就是DVB保留的PID 分配的其他PID一定不会*用这些 ID.解复用程序需要使用到的表* 只有PAT,PMT,SDT,而CA应用还需要使用CA T,EPG应用还需要使用NIT,EIT,TDT,TOT*表* .所以在需要解复用的时候,伪代*需 这*写: void Process_Packet(unsigned char*buff) { &nbsp;&nbsp; int PID=GETPID(buff); &nbsp;&nbsp; if(PID==0x0000) /*这是PAT表*/ &nbsp;&nbsp; { &nbsp;&nbsp;&nbsp; Process_PAT(buff+4);/*处理PAT表*/ &nbsp;&nbsp; } &nbsp;&nbsp; else if(PID==......)/*Video 或者Audio*/ &nbsp;&nbsp; { &nbsp;&nbsp; } &nbsp;&nbsp; else/*其他不支持的PID*/ &nbsp;&nbsp; { &nbsp;&nbsp;&nbsp; printf(&quot;Unknown PID!&quot;); &nbsp;&nbsp; } } 所 有的表*都开始于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内 &gt;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表**/ { &nbsp;&nbsp; Process_PAT(buff+4); } else if(PID==.....)/*Video PID或者Audio PID*/ { } else { &nbsp;&nbsp; /*在这里检测PID是否是PMT的PID*/ &nbsp;&nbsp; for(i=0;i&lt;64;i++) &nbsp;&nbsp; { &nbsp;&nbsp;&nbsp; if(PID==pmt[i].pmt_pid)/*PID*于在PAT检测到的PMT PID相同*/ &nbsp;&nbsp;&nbsp; { &nbsp;&nbsp;&nbsp;&nbsp; Process_PMT(buff+4);/*说明当前Packet是PMT,进入处理*/ &nbsp;&nbsp;&nbsp;&nbsp; break; &nbsp;&nbsp;&nbsp; } &nbsp;&nbsp; } } } 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&lt;64;i++) { if(PID==pmt[i].pmt_pid) { &nbsp;&nbsp; Process_PMT(buff+4); &nbsp;&nbsp; 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;*率&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让用户选择,从而实现比较友好的用 界面! 下面参考一下&lt;&lt;Seekfor MPEG2 decoder&gt;&gt;*的界面和显示信息. 上 图是&lt;&lt;Seekfor MPEG2 decoder&gt;&gt;打开三个不同的*流文件(* .ts)形成的PID信息和节目名称.用户 可以通过切换节目名称的下拉列表框 换节目,也可以通过&quot;视频流&quot;和 &quot;音频流&quot;下拉列表框切换Video和 Audio!这些数据都是通过分析PAT, PMT和SDT得到的.
  Reply With Quote
 


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off


All times are GMT. The time now is 06:56 AM.

 

Powered by vBulletin Version 3.6.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Free Advertising Forums | Free Advertising Message Boards | Post Free Ads Forum