ts数据包33位pts

33位的pts

  1. 由于平台的缺陷,通过硬demux出来的pts值只能读出32位的pts,而服务器发流会参考decode出来的pts值,其它平台是通过在截断的时候将pts的值/90后存储到寄存器,所以后续改进现有的平台返回pts值缺陷。
  2. 针对该问题,通过软demux解析出来第一个pts的值,根据是否大于32位,在返回给服务器的时候将pts的33位置零或置1.
  3. 修改已有代码的问题
  4. 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类型,得到的数值就是不真实。
    1. long long pts=1<<29;pts=(p[0]&0xe)*pts;应该按照这样去移位
    2. 经过测试对于超过32位片源pts的计算最终没有问题
发布了38 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/zhiyanzhai563/article/details/79655944