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。