在网络中收取视频数据的时候,可以通过检查 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;
}
}