PES包的PTS详解

来源:互联网 发布:数据魔方下线 编辑:程序博客网 时间:2024/05/16 11:19

PES包的PTS详解

之前做ts转flv用的是osmf框架,那个东东略复杂,和自己的代码结合后想调整某个地方有些困难,所以还是打算自己来解ts并进行封装。

其中的pts的获取上网查了下,结构图差点没看懂是怎么回事,后来终于搞懂了,浪费了很多时间,这里记录一下吧。


首先是这个图,我被这个图坑了,看了半天没看明白。


上面这个图其实不是很清楚,看了几次还是不知道怎么弄pts,后来在标准上看到了另外一个图,这个就清晰很多了。


其中有箭头指向的表示当前边的flags为1时,将会有后边深色的字段部分。

packet start code prefix:为0x000001;

stream id:

每个字段就不详解了,直接找我要的PTS吧。

先找到original or copy后边得"7 flags",得出是否有pts/dts的标志,标志为高两位,所以 标志= ("7 flags" & 0xc0 )  >>  6;

标志第一位是PTS标识,第二位是DTS标识。

标志:00,表示无PTS无DTS;

             01,错误,不能只有DTS没有PTS;

             10,有PTS;

     11,有PTS和DTS.


接下来,跳过8字节的PES header  data length;

虽然由第二个图可以知道PTS有33位,但是它不是直接的33位数据,而是占了5个字节,PTS分别在这5字节中取。


见过上边这个图的就应该比较清楚了,PTS的33位的各部分是如上图那样分布的,如果从左至右的绿色部分分别为PTS1,PTS2,PTS3的话,那么:

PTS  = (PTS1 & 0x0e) << 29 + (PTS2 & 0xfffe) << 14 + (PTS3 & 0xfffe ) >> 1;

DTS(如果有)紧接着后边读取5个字节的数据,也是这样求出来的。


本文部分图片转自http://www.yunlipiao.com/208.html。


1 0