ts 中 pts 计算

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位


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值