说明

前面2篇文章主要说明了如何安装jrtplib库,以及对example1进行了说明,这篇文章主要说下jrtplib库数据的收发流程。

数据收发流程

从例子1就可以很好的说明jrtplib的使用是非常简单的,主要分为以下几步

1. 设置会话参数(比如时间戳,带宽,发送间隔时间参数的设置等)和传输参数(是否使用已有的socket和端口分配等参数)
2. 创建session对象
3. 为session对象添加目的地址
4. 如果作为数据发送方,则调用发送接口发送数据,如果作为数据接收方,则循环接收数据的到来

重要结构体

例子说明


假如现在有一个使用jrtplib库的应用,比如现在有3个参与者,有1个服务端(图上对应A)和2个客户端(B和C),由图可知,每个参与者都会像其他参与者定时发送RTCP包,但是仅仅只有指定的参与者像其他参与者发送RTP包。在使用jrtplib库的方式上,服务器和客户端上基本上一样,都需要创建一个Session对象,在创建session对象的过程中,会负责创建一些列其他重要对象,比如Transmitter对象,RTCPSchduler对象,RTPSource对象,RTPSourceData对象等。下面就简单说说这些对象的作用

Session对象

jrtplib中最重要的对象,一个对话表示了RTP会话。作用于整个RTP的生命周期,负责RTP数据的收发,以及各种对象的管理。也是用户在使用jrtplib库中最频繁使用的对象。主要作用有以下几个方面
(1)基本上决定了所有对象的生命周期,即创建Session时,会相应创建其他对象,Session生命周期结束时,其他对象也会被释放。
(2)传输参数的相关设置:比如目的地址的管理,自己的传输参数(端口,地址等),多播参数,当然底层是调用传输组件进行相应的设置
(3)参与者的管理:在jrtplib中,每个参与者都对应一个数据源对象,并通过数据源列表对象对所有的数据源对象进行管理。
(4)RTCP计划对象管理:决定何时发送RTCP包,发送包给哪些地址等。
(5)数据的收发以及处理:这是最重要的功能,具体的功能由具体的对象去完成。

RTPTransmitter 对象

主要负责数据的收发,这是一个纯虚类, 具体的实现由具体的子类去实现。只要包括以下几个作用:
(1)判断数据是否来自于我们
(2)检测数据的到来
(3)发送RTP数据和RTCP数据
(4)添加,删除目的地址
(5)多播支持
(6)设置指定的地址可访问(白名单和黑名单管理)
(7)获取下一个源包(RTPRawPacket)

RTPPacketBuilder对象

这个类就是构造RTP包了(RTPPacket对象),主要根据包的负载数据,负载类型,以及当前时间戳,ssrc,扩展头数据(可选)等参数进行构造。
时间戳的计算:上一个包的时间戳+这个包的时间戳增量

RTPSessionSources 对象

数据源列表对象,该对象用来管理所有的数据源,以前面的例子来讲,对于参与者(服务器A)来说,在创建Session对象过程中,也会创建一个数据源对象来表示参与者A(根据SSRC来区分),同时当A收到B和C的RTCP数据包时,会将B和C的数据源添加到数据源列表中进行管理。同理,对于B和C来说,一样具有一个数据源列表对象,列表对象管理3个数据源对象。

RTCPPacketBuilder对象

这个类就是构造RTCP复合包对象(RTCPCompoundPacket对象),构造复合包对象的规则请参考规范的6.1章节。由于RTCP包包括SR、RR、SDES、APP、BYE包等类型,因此这个类对象有对各种RTCP包的构造规则。

RTCPScheduler对象

这个对象决定什么时候构造RTCP复合包,并发送给数据源列表中除自己以外的所有其他数据源。详细的规则可以参考规范6.3章节。

相关API

首先对涉及收发数据相关的API进行说明。

Session对象的API接口

SendPacket

SendPacket(const void *data,size_t len, uint8_t pt,bool mark,uint32_t timestampinc)

参数说明

(1) data:数据指针参数,在流媒体应用中,通常代表某个流的负载数据,比如对于H264,data通常为完整的NALU帧或者FU帧(分片单元,如果NALU帧大于MTU,那么需要将一个NALU帧分多次发送)
(2) len:这个参数为data的长度
(3) pt:负载类型,代表是哪种流媒体的数据, 一般分为动态类型(大于等于96的数字,这个由具体的应用去决定属于什么媒体,比如如果在RTSP中要用到jrtplib库,一般会在服务器端通过SDP描述告诉RTSP客户端,然后客户端接收到了该种负载类型就知道对应的是何种媒体数据,RTSP客户端应当如何去解析媒体数据)。静态类型(小于96的数字),具体负载类型代表了哪种媒体是已经被分配好了的,具体参考RTP负载和媒体对应关系。该参数用于设置RTP头的PT部分。
(4)mark:标志位,请参考协议规范RTP头的mark位,对于H264来说,标志位设置为真,代表一个Access unit结束。
(5)timestampinc:时间戳增量,就是发送一次包,时间戳应该增加多少,比如时间戳单位为1/90000(即是说1s中有90000个单元),如果1s中发送25个包(我们可以看成帧率),那么时间戳增量为3600.

主要作用

就一个作用,发送数据包,如果不看源代码,根据协议规范就知道,发送包肯定是发送的RTP包,
如果这个接口主要实现了:
(1)将data数据添加RTP头,构造RTP包
(2)对发送包做处理(比如加密等),可选操作
(3)给所有的目的地址发送RTP包

流程图

Poll

主要步骤

(1)如果我们不应用PollThread线程去获取数据(即没有使用jthread库),需要我们自己调用该接口去判断是否有数据到来,其中会调用传输组件的Poll去判断是否读取到数据,如果读取到数据,会将数据存放到传输组件的原码包列表中(传输组件的rawpacketlist,每个原码包使用RTPRawPacket来表示,这种包即包括RTCP包,也包括RTP包),流程图如下(以RTPUDPv4Transmitter为例)

(2)调用ProcessPolledData()接口去处理RTPRawPacket包,**注意这个接口我觉得是整个jrtplib中最关键的处理过程,对这个函数掌握了,基本上你就知道什RTP协议是做什么,以及jrtplib的实现思路。**这个接口主要有2个作用
A.解析所有的输入源码包
这里我就说流程图来简单说明下,但是不会做的很详细,详细的会在后续文章中继续说明。

B.判断是否发送RTCP包数据。
参与者随时都可能离开会话,或者长时间没有给其他参与者发送数据(比如上面的A许久没给B和C发送数据,那么B和C的数据源列表中需要将A设置为非发送者等),在jrtplib中,主要有以下几种超时事件:
发送者超时:比如上图中的A许久没给B和C发送数据,那么B和C的数据源列表中在一段时间后会将A的数据源对象设置为非发送者。一般RTP规范一般认为2个周期内没有发送数据,就会被视为非发送者。
成员超时:即一段时间内,该数据源没有像自身发生数据(RTP或者RTCP),一般就会被视为超时,RTP规范认为5个周期内没有发送数据,就会被认为是成员超时,需要从成员列表中删除该数据源
bye成员超时:一般某一个成员在像其他数据源发送BYE包之后,会有一定时间的保留期,如果在这个时间内没像其他数据源发送数据,则被视为这个成员是真正要离开会话了。RTP规范默认为1.
另外还包括SDES note超时和碰撞超时,这里就不介绍了,具体请参考RTP协议规范。
主要流程如下图所示:

总结

本文只是简单介绍了jrtplib数据的收发流程,并没有对代码和详细流程做分析,后面还会细化数据发送和接收数据流程,还会对其中的部分代码进行分析。

jrtplib开源库系列之三:jrtplib发送接收数据流程相关推荐

  1. erp5开源制造业erp短信发送接收机制

    erp5开源制造业erp短信发送接收机制 发送就是直接sendsms,调用运营商的短信发送接口,也可以建立一个定时任务,选择联系人列表批量发送 接收是建立一个定时任务,轮询运营商短信接收接口,将接收的 ...

  2. Python3树莓派连接阿里云物联网设备发送接收数据

    Python3连接阿里云物联网设备发送接收数据(树莓派) 阿里云物联网IOT 代码部分 库文件 Windows下安装环境 树莓派安装环境 可能遇到的错误 代码 效果展示 阿里云物联网IOT 首先,准备 ...

  3. 使用c#实现tcp的连接和发送接收数据

    最近有个小项目,需要调用装置的录波数据,使用tcp模式,在这里整理了下如何使用c#实现tcp连接并实现发送接收数据,分享出来. 我这里使用的tcpclient ,终端是tcpserver模式. 首先自 ...

  4. 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制...

    安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制 socket 连接采用流的方式进行发送接收数据,采用thread线程的方式. 什么是线程?  详细代码介 ...

  5. 求android 中串口的发送接收数据代码

    RT,求高手帮忙! 就是 /dev/ttyS0 和/dev/ttyS1 两个设备的通信问题.. 同求~ 这个是不是需要串口驱动啊?最近正在搞这个串口通信的案子,头疼 同样也没有搞出来,老是报:不能扫描 ...

  6. 微信小程序连接蓝牙 并分包发送 接收数据完整版

    微信小程序连接蓝牙并分包发送接收数据 初始化蓝牙 初始化蓝牙设备 搜索蓝牙设备 连接蓝牙设备 获取蓝牙设备所有service(支持读写的) 向蓝牙发送数据 断开蓝牙 停止搜索蓝牙 转16进制 Arra ...

  7. Android发送接收WiFi,安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制,安卓openwrt...

    安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制,安卓openwrt 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片 ...

  8. linux内核协议栈接收数据流程(一)

    linux网络接收数据第一站--网卡驱动 linux网络接收数据流程的第一站为网卡驱动,网卡接收包流程大致为: 网卡硬件接收到包,会将数据包通过DMA映射到预先分配好的ringbuffer内存环形缓存 ...

  9. [连载 1] 如何将协议规范变成开源库系列文章之 WebSocket

    这是系列文章的第一篇,也是非常重要的一篇,希望大家能读懂我想要表达的意思. 系列文章开篇概述 相对于其他编程语言来说,Python 生态中最突出的就是第三方库.任何一个及格的 Python 开发者都使 ...

最新文章

  1. 只要可能,就缓存数据和页输出
  2. 转 机器学习系列 08:深入理解拉格朗日乘子法、KKT 条件和拉格朗日对偶性
  3. 双向控制引脚的控制代码
  4. Hadoop本地运行模式了解~
  5. openGauss 分区表索引
  6. AI的委屈只有它知道……
  7. 适合小白的word基本操作
  8. 最容易月薪过万城市排名出炉!
  9. 账号被计算机远程终止,宽带远程连接被终止怎么办
  10. 第四篇Scrum冲刺博客
  11. 前端基础从头学——VsCode使用教程+html基础(入门篇)
  12. 《青玉案·元夕》——辛弃疾
  13. python爬虫之使用selenium爬取b站视频信息
  14. plantuml绘制UML图
  15. 解决IE11兼容HTML5 设置:设置兼容性视图网站正常显示网页
  16. 达梦8在VMware虚拟机麒麟系统下命令安装
  17. 小程序项目:基于微信小程序的科普之家小程序—计算机毕业设计
  18. 机器视觉光源的设计方法
  19. android 股票行情界面,Android版的股票行情K线图开发
  20. 2017清北学堂(提高组精英班)集训笔记——基础算法

热门文章

  1. 多项式回归、学习曲线
  2. hdfs命令响应特别慢的问题
  3. 安卓小程序——聊天室(一)
  4. MATLAB FFT算法的应用
  5. win10 startup启动目录路径命令
  6. 安装Java错误1603
  7. 【CicadaPlayer】播放器状态
  8. APP版本号命名规范
  9. 微信小程序云开发获取用户openid
  10. 罗技驱动调节灵敏度方法介绍