原文转自:http://blog.csdn.net/zxh821112/article/details/17587215,有增改。

一 从TS流开始

    数字电视机顶盒接收到的是一段段的码流,我们称之为TS(Transport Stream,传输流),每个TS流都携带一些信息,如Video、Audio以及我们需要学习的PAT、PMT等信息。因此,我们首先需要了解TS流是什么,以及TS流是怎样形成、有着怎样的结构。

    (一) TS流、PS流、PES流和ES流都是什么?

        ESElementary Stream):基本码流,不分段的音频、视频或其他信息的连续码流。

        PES:把基本流ES分割成段,并加上相应头文件打包成形的打包基本码流。

        PSProgram Stream):节目流,将具有共同时间基准的一个或多个PES组合(复合)而成的单一数据流(用于播放或编辑系统,如m2p)。

        TSTransport Stream):传输流,将具有共同时间基准或独立时间基准的一个或多个PES组合(复合)而成的单一数据流(用于数据传输)。

        *NOTE:TS流和PS流的区别:TS流的包结构是长度是固定的;PS流的包结构是可变长度的。这导致了TS流的抵抗传输误码的能力强于PS流(TS码流由于采用了固定长度的包结构,当传输误码破坏了某一TS包的同步信息时,接收机可在固定的位置检测它后面包中的同步信息,从而恢复同步,避免了信息丢失。而PS包由于长度是变化的,一旦某一 PS包的同步信息丢失,接收机无法确定下一包的同步位置,就会造成失步,导致严重的信息丢失。因此,在信道环境较为恶劣,传输误码较高时,一般采用TS码流;而在信道环境较好,传输误码较低时,一般采用PS码流。)

       由于TS码流具有较强的抵抗传输误码的能力,因此目前在传输媒体中进行传输的MPEG-2码流基本上都采用了TS码流的包格。

     (二) TS流是如何产生的?

Center

        

        从上图可以看出,视频ES和音频ES通过打包器和共同或独立的系统时间基准形成一个个PES,通过TS复用器复用形成的传输流。注意这里的TS流是位流格式(分析Packet的时候会解释),也即是说TS流是可以按位读取的。

 

    (三) TS流的格式是怎样的?

        TS流是基于Packet的位流格式,TS流涉及到的单位类型有:

        1. 包(Packet)

            每个包是188个字节(或204个字节,在188个字节后加上了16字节的CRC校验数据,其他格式一样)。

        2. 段(Section)

            多个包组成一个段,每个段不超过1021个字节。

            根据标准,payload_unit_start_indicator为1的包是第一个包,后续的包:1. payload_unit_start_indicator均为0,2. 除去包头就是与前一个包末尾相衔接的数据。我们从第一个包的section_length判断是否有多个包存在,从第一个包的last_section_number判断是否有多个段存在。

             

        整个TS流组成形式如下:

Center

wKioL1fGQaCRV33XAABCSC_wR_k559.png

        PID是TS流中唯一识别标志,Packet Data是什么内容就是由PID决定的。如果一个TS流中的一个Packet的Packet Header中的PID是0x0000,那么这个Packet的Packet Data就是DVB的PAT表而非其他类型数据(如Video、Audio或其他业务信息)。下表给出了一些表的PID值,这些值是固定的,不允许用于更改。

根目录

PSI/SI(Program Specific Information/Service Information节目特定信息/待补充)

PID值
PAT(Program Association Table, 数字电视节目关联表)0x0000
- CAT (Conditional  Access Table,  条件接收表)0x0001
- PMT (Program Map Table, 节目映射表 )由解PAT的结果中得出
- NIT(Network Information Table, 网络信息表)由解PAT的结果中得出
- BAT待补充

- TSDT(Service Description Table)

0x0002
- EIT, ST0x0012
- RST, ST0x0013
- TDT, TOT, ST0x0014

         下面以一个TS流的其中一个Packet中的Packet Header为例进行说明:

wKiom1fGQj7yPuAtAAAqA6nmNzk790.png

sync_byte=01000111,                                就是0x47,这是DVB TS规定的同步字节,固定是0x47.

transport_error_indicator=0,                表示当前包没有发生传输错误.

payload_unit_start_indicator=0,         含义参考ISO13818-1标准文档

transport_priority=0,                                表示当前包是低优先级.

PID=00111 111001010x07e5,              Video PID

transport_scrambling_control=00,      表示节目没有加密

adaptation_field_control=01                  0x01,具体含义请参考ISO13818-1

continuity_counte=0010              即0x02,表示当前传送的相同类型的包是第3个

        TS流的基本内容就是这些了。

        回顾一下,TS流是一种位流(当然就是数字的),它是由ES流分割成PES后复用而成的;它经过网络传输被机顶盒接收到;数字电视机顶盒接收到TS流后将解析TS流。

        TS流是由一个个Packet(包)构成的,每个包都是由Packet Header(包头)和Packet Data(包数据)组成的。其中Packet Header指示了该Packet是什么属性的,并给出了该Packet Data的数据的唯一网络标识符PID。