TS流解析

一.TS格式介绍

TS:全称为MPEG2-TS。

TS即"Transport Stream"的缩写。它是分包发送的,每一个包长为188字节。包的结构为,包头为4个字节(第一个字节为0x47),负载为184个字节。在TS流里可以填入很多类型的数据,如视频、音频、自定义信息等。MPEG2-TS主要应用于实时传送的节目,比如实时广播的电视节目。

MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。简单地说,将DVD上的VOB文件的前面一截cut掉(或者是数据损坏数据)就会导致整个文件无法解码,而电视节目是任何时候打开电视机都能解码(收看)的。

二.TS流包含的内容

一段TS流,必须包含PAT包、PMT包、多个音频包、多个视频包、多个PCR包、以及其他信息包。

解析TS流数据的流程:查找PID为0x0的包,解析PAT,PAT包中的program_map_PID表示PMT的PID;查找PMT,PMT包中的elementary_PID表示音视频包的PID,PMT包中的PCR_PID表示PCR的PID,有的时候PCR的PID跟音频或者视频的PID相同,说明PCR会融进音视频的包,注意解析,有的时候PCR是自己单独的包;CAT、NIT、SDT、EIT的PID分别为: 0x01、0x10、0x11、0x12。

三.TS包头解析

 

//Transport Stream header 
typedef 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; 


 /*特殊参数说明: 
(1)sync_byte:0x47 
(2)payload_unit_start_indicator:0x01表示含有PSI或者PES头 
(3)PID:0x0表示后面负载内容为PAT,不同的PID表示不同的负载 
(4)adaption_field_control: 
     0x0: // reserved for future use by ISO/IEC 
     0x1: // 无调整字段,仅含有效负载    
     0x2: // 仅含调整字段,无有效负载 
     0x3: // 调整字段后含有效负载 
 */ 
// Parse TS header 
int Parse_TS_header(unsigned char *pTSBuf, TS_header *pheader) 
{ 
    pheader->sync_byte = pTSBuf[0]; 
    if (pheader->sync_byte != 0x47)
    {
        return -1; 
    }
    pheader->transport_error_indicator        =pTSBuf[1] >> 7; 
    pheader->payload_unit_start_indicator        =pTSBuf[1] >> 6 & 0x01; 
    pheader->transport_priority                =pTSBuf[1] >> 5 & 0x01; 
    pheader->PID                            =(pTSBuf[1] & 0x1F) << 8 | pTSBuf[2]; 
    pheader->transport_scrambling_control    =pTSBuf[3] >> 6; 
    pheader->adaption_field_control            =pTSBuf[3] >> 4 & 0x03; 
    pheader->continuity_counter                =pTSBuf[3] & 0x0F; 
    return 0; 
}

 

4.TS负载格式解析

4.1 PAT解析

   TS_header包头中的PID值为0x0,表示当前负载为PAT(Program Association Table)。PAT数据的信息可以理解为整个TS流包含的节目信息。