ts数据包33位pts
其他
2020-01-19 11:07:02
阅读次数: 0
33位的pts
- 由于平台的缺陷,通过硬demux出来的pts值只能读出32位的pts,而服务器发流会参考decode出来的pts值,其它平台是通过在截断的时候将pts的值/90后存储到寄存器,所以后续改进现有的平台返回pts值缺陷。
- 针对该问题,通过软demux解析出来第一个pts的值,根据是否大于32位,在返回给服务器的时候将pts的33位置零或置1.
- 修改已有代码的问题
u_int64_t decode_pts(const char* ptr)
{
const unsigned char* p=(const unsigned char*)ptr;
u_int64_t pts=((p[0]&0xe)<<29);
pts|=((p[1]&0xff)<<22);
pts|=((p[2]&0xfe)<<14);
pts|=((p[3]&0xff)<<7);
pts|=((p[4]&0xfe)>>1);
printf("pts value=%lld \n",pts);
return pts;
}
这种解法参考某位大神的,存在的问题
1.在移位运算中,byte、short和char类型移位后的结果会变成int类型
2.((p[0]&0xe)<<29)这种运算会将数值截断位32位的int类型,得到的数值就是不真实。
- long long pts=1<<29;pts=(p[0]&0xe)*pts;应该按照这样去移位
- 经过测试对于超过32位片源pts的计算最终没有问题
发布了38 篇原创文章 ·
获赞 5 ·
访问量 2万+
转载自blog.csdn.net/zhiyanzhai563/article/details/79655944