您的位置:首页 > 其它

ts 中 pts 计算

2015-09-24 16:12 281 查看
http://zhidao.baidu.com/link?url=cw36nJMYAmZKZWbT6BFwHQrBwpd4MdVAuSeNxdtW40XcEAu5gzkU50ec0JN08SvQ4vwrJOl5FdzHPwNZBxLKSel0BbT_KM-CW8ajUCS9tYG

MPEG2/TS流中PES报头中的PTS值如何计算?
在wireshark软件中查看PTS的值,可以看到以秒为单位的时间值。是如何计算出来的?


#define MKWORD(h, l) (((h) << 8) | (l))

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.csdn.net/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位
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: