聚热点 juredian

ts什么意思(ts文件格式解析)

1.TS格式介绍

TS:全称为MPEG2-TS。TS即"Transport Stream"的缩写。它是分包发送的,每一个包长为188字节(还有192和204个字节的包)。包的结构为,包头为4个字节(第一个字节为0x47),负载为184个字节。在TS流里可以填入很多类型的数据,如视频、音频、自定义信息等。MPEG2-TS主要应用于实时传送的节目,比如实时广播的电视节目。MPEG2-TS格式的特点就是要求从视频流的任一片段开始都是可以独立解码的。简单地说,将DVD上的VOB文件的前面一截cut掉(或者是数据损坏数据)就会导致整个文件无法解码,而电视节目是任何时候打开电视机都能解码(收看)的。

2.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。

3.TS包头解析

TS包头有4个字节

//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: // 调整字段后含有效负载 // Parse TS headerint 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解析

领取音视频开发学习资料:https://docs.qq.com/doc/DQm1VTHBlQmdmTlN2

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

//ProgramAssociationTabletypedefstructPAT_Packet_tag{unsigned table_id :8;//固定为0x00,标志是该表是PATunsigned section_syntax_indicator :1;//段语法标志位,固定为1unsigned zero :1;//0unsigned reserved_1 :2;//保留位unsigned section_length :12;//表示有用的字节数,包括CRC32unsigned transport_stream_id :16;//该传输流的ID,区别于一个网络中其它多路复用的流unsigned reserved_2 :2;//保留位unsigned version_number :5;//范围0-31,表示PAT的版本号unsigned current_next_indicator :1;//发送的PAT是当前有效还是下一个PAT有效unsigned section_number :8;//分段的号码。PAT可能分为多段传输,第一段为00,以后每个分段加1,最多可能有256个分段unsigned last_section_number :8;//最后一个分段的号码//for(i=0;i

4.2 PMT解析

由PAT包中的program_map_PID可以确定PMT(Program Map Table)的PID。PMT数据的信息可以理解为这个节目包含的音频和视频信息。

//ProgramMapTabletypedefstructPMT_Packet_tag{unsigned table_id :8;unsigned section_syntax_indicator :1;unsigned zero :1;unsigned reserved_1 :2;unsigned section_length :12;unsigned program_number :16;unsigned reserved_2 :2;unsigned version_number :5;unsigned current_next_indicator :1;unsigned section_number :8;unsigned last_section_number :8;unsigned reserved_3 :3;unsigned PCR_PID :13;unsigned reserved_4 :4;unsigned program_info_length :12;//for(i=0;i

4.3 PES解析

根据文档参考PAT、PMT的解析流程就能完成PES的解析了。

需要注意的是PES中PTS的解析,一般来说在90 kHz 中,PTS/9000的值为秒单位。

unsignedlonglongParse_PTS(unsigned*pBuf){unsignedlonglongllpts = (((unsignedlonglong)(pBuf[0] &0x0E)) <<29) | (unsignedlonglong)(pBuf[1] <<22) | (((unsignedlonglong)(pBuf[2] &0xFE)) <<14) | (unsignedlonglong)(pBuf[3] <<7)>>1);returnllpts;}PES结构详解

领取音视频开发学习资料:https://docs.qq.com/doc/DQm1VTHBlQmdmTlN2

PES前面几个字段填写方法://生成pes头数据buffer[0]=0x00;buffer[1]=0x00;buffer[2]=0x01;buffer[3]=(unsignedchar)(pes->stream_id);buffer[4]=(unsignedchar)((pes_header_len_syt>>8)&0xff);buffer[5]=(unsignedchar)(pes_header_len_syt&0xff);buffer[6]=(1<<7) prc-="">encrypt&0x03)<<4)//2-PES_scrambling_control(0)|((pes_priority&1)<<3)//1-PES_priority(0)|(((~stuff_flag)<<1)&0x04) pes-="">add_pts)<<7)|((unsignedchar)pes->add_user_data);//buffer[7]=((unsignedchar)pes->add_pts)<<7; 8-pes_header_data_lengthpos="9;if(pes-">add_pts){pts=prc->ptime_stamp;buffer[pos++]=(pts>>28&0x0e)|0x21;//4-0010//3-PTS[32..30]//1-marker_bitbuffer[pos++]=(pts>>21);//8-PTS[29..22]buffer[pos++]=(pts>>13&0xfe)|0x01;//7-PTS[21..15]//1-marker_bitbuffer[pos++]=(pts>>6);//8-PTS[14..7]buffer[pos++]=(pts<<2&0xfc)|0x01;//7-PTS[6..0]//1-marker_bit}

接收方PTS时间戳的获取PTS和DTS字段,本来有效信息是33位,扩展至5个字节,也就是40位。扩展方式:

通过上边这个图可以清楚地看到,PTS的33位的各部分,如果从左至右的绿色部分分别为PTS1,PTS2,PTS3的话,那么PTS的计算:

PTS = (PTS1 & 0x0e) << 29 + (PTS2 & 0xfffe) << 14 + (PTS3 & 0xfffe ) >> 1;

DTS(如果有)紧接着后边读取5个字节的数据,也是这样求出来的。

搜索建议:ts什么意思  ts什么意思词条  
热文

 【歌词】情弦 / 歌手:张秀卿

邰正宵 《 单情弦 》曲∶邰正宵 词∶许常德当爱情只剩一根琴弦也许那是最纯洁的思念弹着不变的音阶 象征我永远只让你乱我心房当眼泪落在我的情弦也许寂寞是心碎的终点...(展开)