http://zhidao.baidu.com/link?url=cw36nJMYAmZKZWbT6BFwHQrBwpd4MdVAuSeNxdtW40XcEAu5gzkU50ec0JN08SvQ4vwrJOl5FdzHPwNZBxLKSel0BbT_KM-CW8ajUCS9tYG MPEG2/TS流中PES报头中的PTS值如何计算? 在wireshark软件中查看PTS的值,可以看到以秒为单位的时间值。是如何计算出来的?
uint64 get_pts(uchar *buf)
{
uchar ptsflag;
uchar peshdr_datalen;
int index = 0;
ushort pktlen = MKWORD(buf[index], buf[index+1]);
index += sizeof(ushort);
index ++;
ptsflag = (buf[index] & 0xc0) >> 6;
index ++;
peshdr_datalen = buf[index++];
if (ptsflag & 0x2) {
uint64 pts;
ushort pts29_15, pts14_0;
unsigned uint64 pts32_30 = (buf[index] & 0x0e) >> 1;
index++;
pts29_15 = MKWORD(buf[index], buf[index+1] & 0xfe) >> 1;
index += 2;
pts14_0 = MAKE_WORD(buf[index], buf[index+1] & 0xfe) >> 1;
pts = (pts32_30 << 30) | (pts29_15 << 15) | pts14_0;
pts = pts / 90000;
return pts;
}
return 0;
}
http://bbs.youkuaiyun.com/topics/360091873
资料里给的是PTS是33位 但是为什么算法如下?谁能详细解释下?
data为PES包,是输入参数
//判断PTs标志位,如果有则进行处理
if(uchPTS_DTS_Flag == 0x2 || uchPTS_DTS_Flag == 0x3)
{
//PTS取得
//[32...30]
*pts = ( (U32)data[9] & 0x0e ) << 28;
//[29...22]
*pts |= ( ( (U32)data[10] ) << 21 );
//[21...15]
*pts |= ( ( (U32)data[11] & 0xfe ) << 13 );
//[14...8]
//fkw [14...7]
*pts |= ( (U32)data[12] << 6 );
//[7...1]
//fkw [6...1]
*pts |= (data[13] >> 2);
楼主可以看下MPEG-2的文档,因为PTS那几个字节中间插入了1位maker_bit,所以还原时需要忽略掉。
你参考mpeg2 system文档中的公式就知道了
读一位,左移32位;读两位,左移30位;跳过一位;读15位,左移15位;跳过一位;再读最后15位。共计33位