TS流《一》
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流包含的节目信息。