jrtplib开源库系列之三:jrtplib发送接收数据流程
说明
前面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发送接收数据流程相关推荐
- erp5开源制造业erp短信发送接收机制
erp5开源制造业erp短信发送接收机制 发送就是直接sendsms,调用运营商的短信发送接口,也可以建立一个定时任务,选择联系人列表批量发送 接收是建立一个定时任务,轮询运营商短信接收接口,将接收的 ...
- Python3树莓派连接阿里云物联网设备发送接收数据
Python3连接阿里云物联网设备发送接收数据(树莓派) 阿里云物联网IOT 代码部分 库文件 Windows下安装环境 树莓派安装环境 可能遇到的错误 代码 效果展示 阿里云物联网IOT 首先,准备 ...
- 使用c#实现tcp的连接和发送接收数据
最近有个小项目,需要调用装置的录波数据,使用tcp模式,在这里整理了下如何使用c#实现tcp连接并实现发送接收数据,分享出来. 我这里使用的tcpclient ,终端是tcpserver模式. 首先自 ...
- 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制...
安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制 socket 连接采用流的方式进行发送接收数据,采用thread线程的方式. 什么是线程? 详细代码介 ...
- 求android 中串口的发送接收数据代码
RT,求高手帮忙! 就是 /dev/ttyS0 和/dev/ttyS1 两个设备的通信问题.. 同求~ 这个是不是需要串口驱动啊?最近正在搞这个串口通信的案子,头疼 同样也没有搞出来,老是报:不能扫描 ...
- 微信小程序连接蓝牙 并分包发送 接收数据完整版
微信小程序连接蓝牙并分包发送接收数据 初始化蓝牙 初始化蓝牙设备 搜索蓝牙设备 连接蓝牙设备 获取蓝牙设备所有service(支持读写的) 向蓝牙发送数据 断开蓝牙 停止搜索蓝牙 转16进制 Arra ...
- Android发送接收WiFi,安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制,安卓openwrt...
安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制,安卓openwrt 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片 ...
- linux内核协议栈接收数据流程(一)
linux网络接收数据第一站--网卡驱动 linux网络接收数据流程的第一站为网卡驱动,网卡接收包流程大致为: 网卡硬件接收到包,会将数据包通过DMA映射到预先分配好的ringbuffer内存环形缓存 ...
- [连载 1] 如何将协议规范变成开源库系列文章之 WebSocket
这是系列文章的第一篇,也是非常重要的一篇,希望大家能读懂我想要表达的意思. 系列文章开篇概述 相对于其他编程语言来说,Python 生态中最突出的就是第三方库.任何一个及格的 Python 开发者都使 ...
最新文章
- 只要可能,就缓存数据和页输出
- 转 机器学习系列 08:深入理解拉格朗日乘子法、KKT 条件和拉格朗日对偶性
- 双向控制引脚的控制代码
- Hadoop本地运行模式了解~
- openGauss 分区表索引
- AI的委屈只有它知道……
- 适合小白的word基本操作
- 最容易月薪过万城市排名出炉!
- 账号被计算机远程终止,宽带远程连接被终止怎么办
- 第四篇Scrum冲刺博客
- 前端基础从头学——VsCode使用教程+html基础(入门篇)
- 《青玉案·元夕》——辛弃疾
- python爬虫之使用selenium爬取b站视频信息
- plantuml绘制UML图
- 解决IE11兼容HTML5 设置:设置兼容性视图网站正常显示网页
- 达梦8在VMware虚拟机麒麟系统下命令安装
- 小程序项目:基于微信小程序的科普之家小程序—计算机毕业设计
- 机器视觉光源的设计方法
- android 股票行情界面,Android版的股票行情K线图开发
- 2017清北学堂(提高组精英班)集训笔记——基础算法