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