TS流相关知识

来源:互联网 发布:初中生编程比赛 编辑:程序博客网 时间:2024/05/21 07:52

 

据传输媒体的质量不同,MPEG-2中定义了两种复合信息流:传送流(TS:TransportStream)和节目流(PS:ProgramStream)

       TS流与PS流的区别在于TS流的包结构是固定长度的,而PS流的包结构是可变长度的。
 

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

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

 

        MPEG2-PS主要应用于存储的具有固定时长的节目,如DVD电影,而MPEG-TS则主要应用于实时传送的节目,比如实时广播的电视节目。这两种格式的主要区别是什么呢?你将DVD上的VOB文件的前面一截剪掉(或者干脆就是数据损坏),那么就会导致整个文件无法解码,而电视节目是你任何时候打开电视机都能解码(收看)的,所以,MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。

 

 

TS包长度为188字节,由包头和包数据2部分组成,其中包头还可以包括扩展的自适用区。包头长度占4bytes,自使用区和包数据共占184bytes,这184个字节不一定都是有效数据,有一些可能为填充数据。整个TS包长度相当于4个ATM包长。TS包的包头由如下图摘录所示的同步字节、传输误码指示符、有效载荷单元起始指示符、传输优先、包识别(PID-Packet Identification)、传输加扰控制、自适应区控制和连续计数器8个部分组成。

TS包头定义:

包头4个Byte

//Transport Stream headertypedef struct TS_header{         unsigned sync_byte                    :8;      //同步字节,固定为0x47 ,表示后面的是一个TS分组,当然,后面包中的数据是不会出现0x47的         unsigned transport_error_indicator       :1;      //传输错误标志位,一般传输错误的话就不会处理这个包了         unsigned payload_unit_start_indicator    :1;      //有效负载的开始标志,根据后面有效负载的内容不同功能也不同         // payload_unit_start_indicator为1时,在前4个字节之后会有一个调整字节,它的数值决定了负载内容的具体开始位置。         unsigned transport_priority              :1;      //传输优先级位,1表示高优先级         unsigned PID                          :13;     //有效负载数据的类型         unsigned transport_scrambling_control     :2;      //加密标志位,00表示未加密         unsigned adaption_field_control          :2;      //调整字段控制,。01仅含有效负载,10仅含调整字段,11含有调整字段和有效负载。为00的话解码器不进行处理。         unsigned continuity_counter              :4;      //一个4bit的计数器,范围0-15} TS_header;    //特殊参数说明:   //sync_byte:0x47   //payload_unit_start_indicator:0x01表示含有PSI或者PES头   //PID:0x0表示后面负载内容为PAT,不同的PID表示不同的负载   //adaption_field_control:        // 0x0: // reserved for future use by ISO/IEC        // 0x1: // 无调整字段,仅含有效负载           // 0x2: // 仅含调整字段,无有效负载        // 0x3: // 调整字段后含有效负载


 

第一个包的开头为47 40 00 X,此时pid为0,0x0表示后面负载内容为PAT,不同的PID表示不同的负载。

payload_unit_start_indicator为1时,在前4个字节之后会有一个调整字节,它的数值决定了负载内容的具体开始位置。现在看例子中的数据47 40 00 17 00第五个字节是00,说明紧跟着00之后就是具体的负载内容。

 

从PAT中根据program_map_PID找到对应的含有PMT(Program Map Table)的包。

 

 

在MPEG-2协议中,采用了一种索引的思路来进行节目的寻找
1、  找到PAT表
2、  PAT表之所以叫做节目关联表,就是因为它指出了   当前这个TS流中包含的各个节目其各自所对应的   PMT表的PID
3、  既然我们能知道某个节目它的PMT表所在的TS包   的PID了,那我们就能通过检索PID的方式,把这个      PMT表找出来
4、  PMT表叫做节目映像表,它指出了它所描述的节目 其所对应的视频流、音频流、PCR(时间参考信息)      的PID
5、  既然有了流所在TS包的PID,      那就在当前TS流中过滤出PID等于这个PID值的包,    这些过滤出来的包依序排列,就可以从中还原出流了。
6、  有了视频基本流、音频基本流、参考时钟,机顶盒就能够对节目进行解码,输出显示在电视画面上了。

 

TS 流解码过程:
1. 获取TS中的PAT
2. 获取TS中的PMT
3. 根据PMT可以知道当前网络中传输的视频(音频)类型(H264),相应的PID,PCR的PID等信息。
4. 设置demux 模块的视频Filter 为相应视频的PID和stream type等。
5. 从视频Demux Filter 后得到的TS数据包中的payload 数据就是 one piece of PES,在TS header中有一些关于此 payload属于哪个 PES的 第多少个数据包。 因此软件中应该将此payload中的数据copy到PES的buffer中,用于拼接一个PES包。
6. 拼接好的PES包的包头会有 PTS,DTS信息,去掉PES的header就是 ES。
7. 直接将 被被拔掉 PES包头的ES包送给decoder就可以进行解码。解码出来的数据就是一帧一帧的视频数据,这些数据至少应当与PES中的PTS关联一下,以便进行视音频同步。
8. I,B,B,P 信息是在ES中的。


 

 

 

 

参考资料:

          MPEG2 PS和TS流格式

          TS流的解析(包头定义)      

          TS格式解析         

 

 

0 0