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

news2025/7/21 4:19:43

说明

前面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数据的收发流程,并没有对代码和详细流程做分析,后面还会细化数据发送和接收数据流程,还会对其中的部分代码进行分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/17135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

同花顺_代码解析_技术指标_C

本文通过对同花顺中现成代码进行解析,用以了解同花顺相关策略设计的思想 CBJX 成本均线 成本价均线不同于一般移动平均线系统,成本价均线系统首次将成交量引入均线系统,充分提高均线系统的可靠性。成本均线不容易造成虚假信号或骗线&#xf…

牛客网项目-开发注册功能

前言 本文是对牛客网项目的总结,本文主要讲解页面注册逻辑 当我们点击首页的注册按钮时,会跳转到注册页面,然后再祖册页面提交账号,密码邮箱后会跳转到首页或者直接登录页面进行登录,这个操作可以自己设定 【设计逻辑…

SAP ABAP BAPI_SALESORDER_CREATEFROMDAT2 成本中心 kostl

BAPI_SALESORDER_CREATEFROMDAT2提供参数无成本中心字段,所以需要用扩展字段实现。 BAPE_VBAK: BAPE_VBAKX VBAKKOZ VBAKKOZX 封装扩展结构: DATA: LS_EXTENSION TYPE BAPIPAREX, LT_EXTENSION TYPE TABLE OF BAPIPAREX. DATA: LS_B…

目标检测论文解读复现之十一:基于特征融合与注意力的遥感图像小目标检测

前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

【MySQL】5.触发器

文章目录1. 触发器概述2. 触发器的相关语法3. 触发的NEW与OLD4. 总结1. 触发器概述 触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL片段,但是触发器无需调用,当对数据库表中的数据…

python批量读取nc气象数据并转为tif

python批量nc数据转tif 各类地理数据中,NC格式是很常见的,然而这种格式ArcGIS是无法打开的。一旦下载的话nc也是多时序的(多年、多月等等),让我们看看如何批量操作吧。 直接上代码: import numpy as np …

[附源码]Python计算机毕业设计本科生外出请假管理信息系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

数据结构和算法

1.数据结构 食谱和算法之间最大的区别就在于算法是严密的。食谱上经常会有描述得比较模糊的部分, 而算法的步骤都是用数学方式来描述的,所以十分明确。 算法和程序有些相似,区别在于程序是以计算机能够理解的编程语言编写而成的,…

构造函数详解

构造函数详解1.构造函数的概念与特性2.默认构造函数(1)概念(2)分类(3)工作原理3.初始化列表(1)定义(2)为什么使用初始化列表(3)必须使…

WebRTC系列<五>我与一位大佬的聊天记录

原本打算想用webrtc部署虚幻项目。后来在了解虚幻过程中,得知虚幻有像素流插件,导出项目里带有STUN和TURN服务,但是在webGL项目里比如three.js、babylon.js如果也能部署在服务器端,那就厉害了,也很有想象力空间。 基本…

表白墙网站练习【前端+后端+数据库】

表白墙网站练习【前端后端数据库】 开发该表白墙(简单网站)的基本步骤: 1.约定前后端交互接口 2.开发服务器代码 编写Servlet能够处理前端发来的请求编写数据库代码,来获取/存储关键数据 3.开发客户端代码 基于ajax能够构造请…

一体化Ethercat通信伺服电机在汇川H5U PLC上的应用案例介绍(上)

内容介绍了一体化低压伺服Ethercat通信的电机在汇川H5UPLC上的使用,本篇主要讲解环境的搭建以及使用AutoShop软件的在线调试功能,简单控制电机位置、速度模式运行; 一、系统构成 本系统主要构成是电脑,H5U-1614MTD-A8,…

家长杂志家长杂志社家长编辑部2022年第30期目录

卷首语 读懂童心,营造乐学趣学好场景 本刊编辑部; 1 本刊视线_关注《家长》投稿:cn7kantougao163.com 留守儿童学习动力不足的成因与激发策略 蔡斌林; 4-6 农村留守儿童加强心理健康教育的策略 张芸; 7-9 本刊视线_学校体育 中学体育线上线下教学融…

【Struts2框架】idea快速搭建struts2框架

文章目录什么是SSH框架?Struts2框架1、struts2的环境搭建1.1 创建web项目(maven),导入struts2核心jar包1.2 配置web.xml(过滤器),是struts2的入口,先进入1.3 创建核心配置文件struts…

STM32 Bootloader开发记录 3 固件签名校验

STM32 Bootloader开发记录 3 固件签名校验 文章目录STM32 Bootloader开发记录 3 固件签名校验1. 移植mbedtls1.1 编译mbedtls1.2 修复rsa_sign的一个bug1.3 测试RSA1.3.1 **RSA加解密:**1.3.2 **RSA签名验签:**1.3.3 **生成秘钥对**1.4 移植到STM321.4.1…

NFV中:DPDK与SR-IOV应用场景及性能对比

DPDK与SR-IOV两者目前主要用于提高IDC(数据中心)中的网络数据包的加速。但是在NFV(网络功能虚拟化)场景下DPDK与SR-IOV各自的使用场景是怎样的?以及各自的优缺点? 本文主要通过从以下几点来阐述这个问题&a…

视觉SLAM十四讲(高翔版本),ch4章节部分笔记

目标:理解slam的框架以及它的理论知识。供以后自己查阅。 这一章主要非常重要,也是理解后续优化的基础,它是将旋转矩阵和平移向量,转化为李代数的形式进行优化,因为它有很多好处。好处如下: 意思就是采用…

Linux硬盘垃圾清理心得

最近有台系统盘才10G的服务器咔咔报警,一共才10G的空间,运维还设置了80%的报警阈值,实在难顶。为了清理硬盘里的垃圾,敲了不少命令,怕以后忘了,记录一下。 首先输入df -h查看一下硬盘空间占用情况&#xf…

呼叫中心中间件(mod_cti基于FreeSWITCH)-通话记录(CDR)接口

支持把FreeSWITCH的通话记录写入mysql,sqlserver,oracle等数据库,也可以写入redis的list,或者PUBLISH到redis的channel,方便业务程序实时获取通话记录。 使用说明 如果一个通话是A呼叫B,那么就有2个通话记录,一个叫aleg,一个叫b…

Vue3 - 全局指令(详细教程)

前言 咱们在真实项目开发中,其实有很多指令都是通用的。我们绝对不可能去每个页面都定义一次,这样不仅写起来困难,维护起来更是困难,你想一下,假设稍微变点逻辑,你就需要翻阅好几个文件去改。 其实用法和局…