从事流媒体开发的朋友经常会用到rtp协议,今天我就udp荷载rtp包编码过程中经常遇到的重复包以及丢包如何判断说一下自己的经验。总体思路如下:

1、基于udp协议的rtp包接受包处理;
2、把收到的rtp包放入map容器中;map容器设置如下:std::map<int, RtpData> RtpDataMap;其中int值为rtp包的序列号,RtpData为自定义的结构体,用来存储每个rtp包内容(rtp包序列号、时间戳、marker值、rtp包数据有效长度以及rtp包数据等);
3、通过rtp包的marker值或者rtp包时间戳判断出完整的一帧数据之后,此时你的map容器中应该包括完整的一帧rtp包数据,可以通过map容器中的int值判断是否丢包以及包重复。

以上为总体思路概述。下面进行伪代码分析:

1、先简单介绍一下rtp包解析过程:
typedef struct RTP_FIXED_HEADER{/*byte 0*/unsigned char csrc_len : 4;unsigned char extension : 1;unsigned char padding : 1;unsigned char version : 2;/*byte 1*/unsigned char payload : 7; unsigned char marker : 1;/*byte 2, 3*/uint16_t seq_no;/*byte 4-7*/uint32_t timestamp;/*byte 8-11*/uint32_t ssrc;
} RTP_FIXED_HEADER;RTP_FIXED_HEADER rtp_header;
int rtp_header_size = sizeof(RTP_FIXED_HEADER);
//buffer为recv函数接收到的完整的rtp数据包内容
memcpy((void*)&rtp_header, buffer, rtp_header_size);
unsigned int  timestamp = ntohl(rtp_header.timestamp);
unsigned int  seq_no = ntohs(rtp_header.seq_no);
unsigned int marker = rtp_header.marker;rtp_data = buffer + rtp_header_size;
//iDataNum为recv函数收到的rtp包大小
unsigned int rtp_data_size = iDataNum - rtp_header_size;//此时rtp包接收、解析完成。//定义RtpData结构体,开始重复包以及丢包判断
struct RtpData
{unsigned int seqNum;unsigned int isMark;unsigned int len;unsigned char data[1600];unsigned int  timestamp;CacheData(){seqNum = -1;isMark = false;len = 0;timestamp=-1;}
};RtpData dataTemp;dataTemp.seqNum=seq_no;dataTemp.len=rtp_data_size;dataTemp.timestamp=timestamp;dataTemp.isMark=marker;memcpy(dataTemp.data, RecvBuffer + rtpheadlen, dataTemp.len);//重复包的判断if (RtpDataMap.find(dataTemp.seqNum) != RtpDataMap.end()){//repeate datacontinue;}RtpDataMap[nSeqNum] = dataTemp;int SeqNum=dataTemp.seqNum;//判断为完整的一帧数据后操作if (dataTemp.isMark){isComFrame = true;for (int i = beginSeq; i <= SeqNum; i++){   //判断rtp是否丢包if (RtpDataMap.find(i) == cacheMap.end()){isComFrame = false;break;}}//完整的一帧数据操作if (isComFrame){//do something//根据你自己的业务需求处理}//beginSeq的维护beginSeq = SeqNum + 1;//无论是否为完整的一帧数据都会清空RtpDataMap.clear();

以上即为基于rtp协议的rtp包重复以及丢包检测的判断方法。该方法是基于一帧rtp数据包来进行判断的。

rtp协议丢包以及包重复判断相关推荐

  1. H264视频传输、编解码----RTP协议对H264数据帧拆包、打包、解包过程

    H264帧需要通过RTP协议进行传输,这其中就涉及到H264数据帧的封包.拆包和解包等过程. RTP协议格式 下面是 RFC 3550 中规定的 RTP 头的结构: 0 1 2 3 40 1 2 3 ...

  2. TCP 协议如何解决粘包、半包问题

    TCP 协议是流式协议 很多读者从接触网络知识以来,应该听说过这句话:TCP 协议是流式协议.那么这句话到底是什么意思呢?所谓流式协议,即协议的内容是像流水一样的字节流,内容与内容之间没有明确的分界标 ...

  3. RTP 上封装H264 数据包

    原文链接:https://www.cnblogs.com/Jade2009/p/5654650.html 1.  引言         随着信息产业的发展,人们对信息资源的要求已经逐渐由文字和图片过渡 ...

  4. RTP之H264封包和解包

    RTP之H264封包和解包 目录 H264打包RTP的方法 打包方式之Single NAL Unit 打包方式之FU-A FU indication FU header 1. H264打包RTP的方法 ...

  5. mysql认证包_mysql协议分析2---认证包

    主人看到navicat和mysql在那嘻嘻哈哈,眉来眼去的,好不快乐,忽然也想自己写个程序,直接去访问Mysql,虽然现在已经有很多现成的中间件可以直接拿来用了,程序只要负责写sql语句就行了,但是主 ...

  6. 简单自定义协议的封包和解包

    简单自定义协议的封包和解包 一.通信协议 1 百度百科的解释 2 过于简单的通信协议引发的问题 3 通信协议常见内容 1.帧头 2.设备地址/类型 3.命令/指令 4.命令类型/功能码 5.数据长度 ...

  7. 简单说说USB协议(二)包的结构与包的分类

    无论是什么传输设备,通信的过程就涉及到传输方法,USB协议中有四种传输方式:批量传输.中断传输,等时传输,控制传输.因此在这些传输方式上传输的都是包,所以在了解传输方式前,还需要知道包是个什么东西. ...

  8. [网络知识]TCP协议中的粘包与拆包

    在平时客户端socket开发中,如果客户端连续不断的向服务端发送数据包时,服务端接收的数据会出现两个数据包粘在一起的情况,这就是TCP协议中经常会遇到的粘包以及拆包的问题. 我们都知道TCP属于传输层 ...

  9. socket 网络通信(基于tcp协议)以及粘包解决方案

    socket 网络通信(基于tcp协议)以及粘包解决方案 参考文章: (1)socket 网络通信(基于tcp协议)以及粘包解决方案 (2)https://www.cnblogs.com/amiee- ...

最新文章

  1. linux===Ubuntu 上安装 Node.js
  2. 实际开发中,有时没有异常发生,但是执行结果不是我们期望的情况,需要手动让事务回滚
  3. 只剩 1 天 | 神策 2019 数据驱动大会明天开幕
  4. 开发自定义控件的笔记 (2)
  5. android详细解释键盘和鼠标事件
  6. h5 video 手机 显示第一帧_【图像处理二】HDMI显示(一)
  7. php 实现application,PHP中实现ASP中的Application 功能
  8. Windows 平台下Myeclipse 10 中SVN 插件使用教程(TortoiseSVN)
  9. 【电力负荷预测】基于matlab粒子群算法优化支持向量机预测电力负荷【含Matlab源码 1225期】
  10. 《机器人动力学与控制》第九章——动力学 9.2 动能与势能的一般表达
  11. Linux高级命令find,grep,sed,awk
  12. Python 使用itchat 获取微信好友信息并解析(性别 区域 头像 签名等)
  13. 控制系统中带宽的理解
  14. cherry-pick 用法
  15. 基于Java的微小企业人事管理系统的设计与实现 毕业设计-附源码231012
  16. Greenplum--Triggering FTS prob故障检测原理
  17. C++中cout、cin和endl的用法
  18. 基于遗传算法自动组卷的实现
  19. android 根目录缓存,Android 文件目录存储介绍 缓存目录 | 私有目录 | 系统根目录 | 用户可见目录...
  20. 实现strStr()函数(C++)

热门文章

  1. 室内定位UWB全方位保障井下安全
  2. 收集一些网页模板/素材的网站
  3. python实验九答案_Python程序设计实验报告(九)
  4. 司普沃浅谈辣椒炭疽病防治技术与管理
  5. lamp+cakephp下配置fckeditor详解 --by heng
  6. 使用Docker容器,这些错误千万别犯
  7. 中基鸿业小故事投资理财大启示
  8. Mindjet MindManager思维导图使用技巧
  9. python交易策略源码_经典的股票量化交易策略(含源码)
  10. Google play中“此应用与您设备不兼容”的问题