接收rtpovertcp负载数据代码-创新互联

场景

成都创新互联是一家集网站建设,东海企业网站建设,东海品牌网站建设,网站定制,东海网站建设报价,网络营销,网络优化,东海网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

    在建立RTSP连接之后,通过rtp over tcp接收视频数据,在下面的例子中获取到的数据流,还是存在相隔2个RTP负载的问题,但是从字节来看,RTP的负载非常小,应该对数据没有任何的影响


说明

    m_sock->RecvBuffer(pszOneBytes, nRealReadLen, 1);第二个参数是真实读取到的字节数,第三个参数是指定当前读取多少个字节

代码


struct RTPHeader

{

unsigned char szHeader[4];

};

unsigned short sRTPPayLoadLen = 0;//整个RTP报文的长度,由$ 0x00|0x01 后面的两个字节决定

unsigned char cOneBytes = 0;//保存第一个字节,进行判断是否是$,从而判断是否是RTP负载包,还是RTSP指令包

char* pszOneBytes = (char*)&cOneBytes;//接收数据只能通过符号字符,因此采用强制转换

int nRealReadLen = 0;//保存了每一次读取的字节个数

int nRet = m_sock->RecvBuffer(pszOneBytes, nRealReadLen, 1);//建立rtsp链接之后,开始读取第一个字节

if (nRet <= 0)

{

exit(0);

}

while (true)

{

if ('$' == cOneBytes)

{

nRet = m_sock->RecvBuffer(pszOneBytes, nRealReadLen, 1);

if ((nRet <= 0) || (nRet != 1)) break;

if ('$' == cOneBytes) continue;//两个$$相连也是有可能的,重新循环

if (0x00 == cOneBytes || 0x01 == cOneBytes)//读取到有效的数据

{

nRet = m_sock->RecvBuffer(pszOneBytes, nRealReadLen, 1);//尝试读取高位的负载长度

if ((nRet <= 0) || (nRet != 1)) break;

if ('$' == cOneBytes) continue;

sRTPPayLoadLen = cOneBytes << 8;

if (sRTPPayLoadLen < -1 || sRTPPayLoadLen > 1500) continue;//高位有可能是0,因为有时候多个RTP只是携带格式信息,但是没有携带数据负载

nRet = m_sock->RecvBuffer(pszOneBytes, nRealReadLen, 1);//尝试读取低位的负载长度

if ((nRet <= 0) || (nRet != 1)) break;

//if ('$' == cOneBytes) continue;//有可能低位刚好就是24,所以这一点是不需要担心的

sRTPPayLoadLen = sRTPPayLoadLen + cOneBytes;

if (sRTPPayLoadLen < 0 || sRTPPayLoadLen > 1500) continue;//数据不可能超过1500,局域网传输带宽要求

char szRTPPayLoadContent[1500] = { 0 };

nRealReadLen = 0;

nRet = m_sock->RecvBuffer(szRTPPayLoadContent, nRealReadLen, sRTPPayLoadLen);

RTPHeader* pHeader = (RTPHeader*)szRTPPayLoadContent;

unsigned short sRTPSeq = (pHeader->szHeader[2] << 8) + pHeader->szHeader[3];

//std::cout << "curSeq:" << sRTPSeq << std::endl;

static int nLastSeq = sRTPSeq;

int nGap = sRTPSeq - nLastSeq;

if (nGap != 1)

{

std::cout << "rtp seq gap:" << nGap <<",lastSeq:"<

}

nLastSeq = sRTPSeq;

//循环读取负载的长度报文,一次可能读取不了完整的一个RTP负载的报文

while (nRealReadLen < sRTPPayLoadLen)

{

memset(szRTPPayLoadContent, 0x00, 1500);

sRTPPayLoadLen = sRTPPayLoadLen - nRealReadLen;

nRealReadLen = 0;

nRet = m_sock->RecvBuffer(szRTPPayLoadContent, nRealReadLen, sRTPPayLoadLen);

}

}

}

nRet = m_sock->RecvBuffer(pszOneBytes, nRealReadLen, 1);

if ((nRet <= 0) || (nRet != 1)) break;

}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


分享名称:接收rtpovertcp负载数据代码-创新互联
文章转载:http://myzitong.com/article/dcjhjh.html