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位
相关文章推荐
- leetcode6
- ADS2009U1安装破解步骤及文件下载地址(亲测XP_WIN7成功)
- 白话经典算法系列之二 直接插入排序的三种实现
- PIC24FJ64GB002 with bluetooth USB dongle
- PLSQL Developer常用设置及快捷键
- SVN
- JS设计模式-单例模式
- 面试问题集锦
- POJ 2031:Building a Space Station 最小生成树
- 注册表reg文件编写
- iOS多线程学习---线程同步
- MyBatis返回主键,MyBatis Insert操作返回主键
- 介绍一种android的裸刷机方法(fastboot刷机实质)
- Windows 10问题
- POJ 2031:Building a Space Station 最小生成树
- js判断页面出现滚动条
- hive升级测试记录
- jz2440的中断处理流程
- 这些基础却重要的面向对象概念,你还记得多少
- EIRGP配置实验