精解PSI-SI(一).doc
上传人:yy****24 上传时间:2024-09-10 格式:DOC 页数:5 大小:36KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

精解PSI-SI(一).doc

精解PSI-SI(一).doc

预览

在线预览结束,喜欢就下载吧,查找使用更方便

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

HYPERLINK"http://www.cnblogs.com/KUDO/archive/2008/10/15/1311852.html"精解PSI-SI(一)Packet的概念(1)TS流是基于Packet的位流格式,每个包是188字节或者204字节(一般是188字节,204字节的格式仅仅是在188字节的Packet后部加上16字节的CRC数据,其他格式是一样的),整个TS流组成如下所示:Packet1Packet2......Packetn在实际使用中,因为TS流已经内部具有很强的错误处理能力,所以一般使用较多的是188字节一个包的格式,204字节一个包的格式据说一般在高清节目中使用较多.所有的Packet格式都是统一的,包括一个Packetheader和Packetdatas.其中Packetheader包含了同步字节(该字节固定是0x47,表示这个包的数据开始是正确的),该Packet的唯一号码(即PID)和其他一些信息.格式如下(用C格式表示)typedefstruct{unsignedsync_byte:8;unsignedtransport_error_indicator:1;unsignedpayload_unit_start_indicator:1;unsignedtransport_priority:1;unsignedPID:13;unsignedtransport_scrambling_control:2;unsignedadaptation_field_control:2;unsignedcontinuity_counter:4;}PACKET_HEADER;以上结构刚好占用32bits,即4个字节,因此一个TS流的Packet头部的4字节是header信息,分析该header信息就可以知道当前Packet的属性.剩下的184字节有可能是Video数据,也有可能是Audio数据,也有可能是DVBSI信息,怎么区分呢?其实很简单,就是利用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就可以这样处理了(伪代码描述):voidProcess_Packet(unsignedchar*buff){intPID=GETPID(buff);if(PID==0x100){SaveToVideoBuffer(buff+4);}elseif(PID==0x103){SaveToAudioBuffer(buff+4);}else{printf("unknownPID!"n");}}现在的问题是,编码的时候分配好的PID,在解码的时候是怎么知道什么PID对应什么数据呢?这就是DVBSI表格的分析与处理了,请参考第三章.这里先看一个实际的TS码流的例子.这里的数据是用UltraEdit用16进制格式打开TS码流文件得到的.文件是Taiwan-551.ts.这里仅仅截取了3个Packet的信息,请注意图中用红色标注的部分,这就是TS流Packet的4个字节的头信息.这个TS流是采用每个包共188字节的格式,因为两个头信息的间隔是188个字节(第一个0x47到第二个0x47的间隔).以后的所有的Packet都将是188字节的格式,这是DVBTS标准规定的固定大小.那么这三个包分别包含的是什么数据,下面我们可以自己分析一下.先看第一个包,头信息数据是"0x470x070xe50x12",刚才已经知道了,header信息都是按位操作的(这就是为什么TS码流也可以叫做位流的原因),特别要注意的是定义和传输的时候都是MSBfirst,也就是说,先出现的位是数据的最高位.先转化成2进制格式:01000111000001111110010100010010请对照上面的PACKET_HEADER结构:typedefstruct{unsignedsync_byte:8;unsignedtransport_e