PES包结构解析

版权声明:本文为博主原创文章,未经博主允许不得转载。个人独立博客:https://ichenwin.github.io GitHub、知乎等网站用户名:iChenwin https://blog.csdn.net/u013993802/article/details/84946333
  1. PES包结构图解:
    在这里插入图片描述
  2. PES前面几个字段填写方法:
// 生成 pes 头数据
    buffer[0] = 0x00;
    buffer[1] = 0x00;
    buffer[2] = 0x01;
    buffer[3] = (unsigned char)(pes->stream_id);
    
    buffer[4] = (unsigned char)((pes_header_len_syt >> 8) & 0xff);
    buffer[5] = (unsigned char)(pes_header_len_syt & 0xff);
    
	buffer[6] =   (1<<7)//  2 - check bits '10'
                | ((prc->encrypt & 0x03) << 4)//  2 - PES_scrambling_control(0)
                | ((pes_priority & 1) << 3)//  1 - PES_priority(0)
                | (((~stuff_flag) << 1) & 0x04)     //  1 - data_alignment_indicator(0)	
			    | 0                                 //  1 - copyright(0)
				| 0;                                //  1 - original_or_copy(0)
    
	buffer[7] = (((unsigned char)pes->add_pts) << 7) | ((unsigned char)pes->add_user_data);
//	buffer[7] = ((unsigned char)pes->add_pts) << 7;
                    //  2 - PTS_DTS_flags()
					//  1 - ESCR_flag(0)
					//  1 - ES_rate_flag(0)
					//  1 - DSM_trick_mode_flag(0)
					//  1 - additional_copy_info_flag(0)
					//  1 - PES_CRC_flag(0)
					//  1 - PES_extension_flag()
	
    buffer[8] = (unsigned char)pes_header_ext_len;	//  8 - PES_header_data_length				

    pos = 9;
    if (pes->add_pts)
    {
        pts = prc->ptime_stamp;
        buffer[pos++] = (pts >> 28 & 0x0e) | 0x21;	    //  4 - '0010'
		    										//  3 - PTS [32..30]
												    //  1 - marker_bit
	    buffer[pos++] = (pts >> 21);					//  8 - PTS [29..22]
	    buffer[pos++] = (pts >> 13 & 0xfe) | 0x01;	    //  7 - PTS [21..15]
												    //  1 - marker_bit
	    buffer[pos++] = (pts >>  6);					//  8 - PTS [14..7]
	    buffer[pos++] = (pts << 2  & 0xfc) | 0x01;	    //  7 - PTS [6..0]
		                							//  1 - marker_bit
    }
  1. 接收方PTS时间戳的获取
    PTS和DTS字段,本来有效信息是33位,扩展至5个字节,也就是40位。扩展方式:
    在这里插入图片描述
    通过上边这个图可以清楚地看到,PTS的33位的各部分,如果从左至右的绿色部分分别为PTS1,PTS2,PTS3的话,那么PTS的计算:
    PTS = (PTS1 & 0x0e) << 29 + (PTS2 & 0xfffe) << 14 + (PTS3 & 0xfffe ) >> 1;
    DTS(如果有)紧接着后边读取5个字节的数据,也是这样求出来的。

猜你喜欢

转载自blog.csdn.net/u013993802/article/details/84946333