千家信息网

接收rtp over tcp 负载数据代码

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,场景在建立RTSP连接之后,通过rtp over tcp接收视频数据,在下面的例子中获取到的数据流,还是存在相隔2个RTP负载的问题,但是从字节来看,RTP的负载非常小,应该对数据没有任何的影响说明m
千家信息网最后更新 2025年12月01日接收rtp over tcp 负载数据代码

场景

在建立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;

}


数据 字节 长度 报文 两个 低位 参数 还是 高位 尝试 循环 代码 有效 三个 个数 例子 信息 只是 场景 多个 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 迪肯大学网络安全教学 华为数据库认证和达梦数据库认证 u盘插到esxi服务器 崇明区互联网教育科技诚信经营 信息与网络安全工作制度 海南高科技软件开发价格表格 excel表格怎么录入数据库 2008r数据库如何重启 JAVA框架部署到服务器 商业密码保护网络安全吗 cis2020网络安全大会 网络安全是基建的基石吗 计算机网络技术基础用学吗 维护个人信息安全与网络安全 法半夏枇杷膏药品广告数据库 网络安全突发事件应急处理方法 广东视频云空间定制服务器 网络安全核心技术可以出口吗 欧亚监管数据库ios13 方舟什么服务器能下载 智能化工厂的数据库 如何注意网络安全问题文字 郑州仁峰软件开发有限公司李瑾 专注森林服务器为什么不同 电视剧中的网络安全大赛 小米服务器安全 网关服务器和路由器有关系吗 公司里如何快速建立数据库 烟台安凯网络技术有限公司 期货 内存数据库
0