音视频CC计数检查

来源:互联网 发布:javascript语言特点 编辑:程序博客网 时间:2024/05/22 07:59
在网络中收取视频数据的时候,可以通过检查 CC来判断网络中是否存在丢包问题,CC字段是在 TS头中的一个计数值,正常情况下它是从0到15的连续值(到达16后变为0)。
编码思路:首先记录第一次的 CC值,然后再收到数据包的时候和上次保存的 CC值进行对比,如果差1说明网络中没有丢包。
有以下几种情况 CC计数是可以不连续的:
1.调整字段的值为 00或者 10的时候,说明这个数据包中没有音视频数据,所以 CC不计数;
2.当前数据包中存在调整字段,并且调整字段有数据,如果调整字段设置了不连续计数标志位的话,这种情况下 CC不计数。

代码:
pThis->m_cc = (pData[3] & 0x0f);//pData是获取的 188字节的TS数据
 
if (pThis->m_last_cc == -1)
{
    pThis->m_last_cc = pThis->m_cc;
}
else
{
    if (0 == (pData[3] & 0x10))     // 调整字段为00或10时,连续计数值不增加
    {
        pThis->m_last_cc = -1;
    }
    else if (0 != (pData[3] & 0x20) && pData[4] > 0) // 存在调整字段11,并且调整字段大于0,检查是否有不连续计数位
    {
        unsigned int uDiscontinuityIndicator = pData[5] & 0x80;
        if( (pThis->m_cc != ((pThis->m_last_cc + 1) &0x0f)) && (0 == uDiscontinuityIndicator) )
        {
            log_info(" last cc is %d new cc is %d\n", pThis->m_last_cc, pThis->m_cc);
        }
 
        pThis->m_last_cc = pThis->m_cc;
    }
    else
    {
        if(pThis->m_cc != ((pThis->m_last_cc + 1) &0x0f))
        {
            log_info(" last cc is %d new cc is %d\n", pThis->m_last_cc, pThis->m_cc);
        }
 
        pThis->m_last_cc = pThis->m_cc;
    }
}



0 0