16.live555mediaserver-保活机制

live555工程代码路径
live555工程在我的gitee下(doc下有思维导图、drawio图):
live555
https://gitee.com/lure_ai/live555/tree/master

章节目录链接
0.前言——章节目录链接与为何要写这个?
https://blog.csdn.net/yhb1206/article/details/127259190?spm=1001.2014.3001.5502

学习demo
live555mediaserver.cpp

学习线索和姿势
1.学习的线索和姿势

网络编程
流媒体的地基是网络编程(socket编程)。
[网络编程学习]-0.学习路线。

绘图规则
本文的对象图和思维导图遵守的规则详见:
2.绘图规则

非阻塞服务端网络编程流程
socket创建、bind、listen、select、accept、select、recv/send-close。

rtsp协商流程
options、describe、setup、play、pause、teardown、get parameter、set parameter

rtp打包流程
打开媒体文件、读取一帧媒体数据、rtp打包、rtp发送

本节内容和目标
(1)live555mediaserver的保活机制
(2)rtcp协议学习
(3)wireshark抓包
(4)

正式开始

14.live555mediaserver-setup请求与响应
从第一个setup开始,创建了新对象 RTSPServer::RTSPClientSession ,而它就引入了server端的保活机制——其父类实现的 noteLiveness 方法。设置65s的alarm的定时器加入定时器列表,如果超过65s则server端断开rtsp链接。接下来第2次setup或者play等都会调用noteLiveness 来刷新这个65s的时间。注意这个是客户端下方setup或play,server来被动刷新这个时间的。
那么play之后,server端不断发送rtp包,它是如何刷新?目前发现是server自己间隔一段时间自己调用这个保活的方法,如下,搞不懂。

在这里插入图片描述
在这里插入图片描述

可以看到在play时把 GenericMediaServer::ClientSession::noteClientLiveness 这个静态方法注册到回调里去了,它其实质就是调用的 noteLiveness 。
看下它注册到哪里去了,追踪下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看到它最终放到rtcp对象里的表格里了,可以猜测是rtcp接管了这个保活。这个注册回调完毕。那么在哪调用呢?追踪下:
在这里插入图片描述
noteArrivingRR直接调用它的,在什么时机下调用它呢?继续:
在这里插入图片描述
RTCPInstance::processIncomingReport调用的,大概意思也就是说在收到客户端的rtcp的接收⽅报告RR的时候才会调用noteArrivingRR方法,然后自然刷新保活。

那么再追踪谁调用RTCPInstance::processIncomingReport,就属于rtcp业务的流程是什么样的,看一点:
在这里插入图片描述
是RTCPInstance::injectReport调用的RTCPInstance::processIncomingReport。继续追踪:

在这里插入图片描述
MultiFramedRTPSource::networkReadHandler1() 调用的RTCPInstance::injectReport;
静态方法MultiFramedRTPSource::networkReadHandler调用的RTCPInstance::injectReport

在这里插入图片描述
静态方法MultiFramedRTPSource::networkReadHandler是在MultiFramedRTPSource::doGetNextFrame()里注册到socket任务里的,看fAreDoingNetworkReads这个成员保证只注册一次,这个socket任务如何注册的可以参见4.live555mediaserver-第一次select,不再赘诉。

15.live555mediaserver-rtp打包与发送知道音视频的rtp发送是根据帧率计算定时间隔,创建定时器任务加入定时器列表里,每次都是这样的任务循环的。这样不断的发送rtp数据。现在呢,再补充下在MultiFramedRTPSource::doGetNextFrame()里又注册了一个socket任务用于发送和接受客户端的rtcp的回包。

这就是涉及到rtcp了,参见好文章RTCP协议讲解。

总之呢,就是server端发送rtcp信息到客户端,客户端回报,接受到客户端的rtcp回报类型是RR的时候才会刷新这个保活,保持这个链接不断。目前只追踪了这个流程,具体它的时间间隔是怎样的,不知道怎么看?wireshark抓包看下。

在这里插入图片描述
抓包看,RR包有时间隔不到1s又时间隔4s,具体间隔不太懂,rtcp协议不懂得看下。

加日志看下
搜索关键字delete alarmHandler|PLAY rtsp|fLivenessCheckTask|SETUP rtsp
发现下
在这里插入图片描述
setup开始加入65s的定时任务,setup和play会刷新,那么rtp发送后确实是由rtcp来接管了,每次收到RR后才会刷新这个65s的定时任务。

小结

探索了server端的保活机制,这涉及到了rtcp协议,由rtcp接管了。接受到RTCP的RR时才会刷新,这样保活的。这个保活机制和我想象的不一样,不懂,再说。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【MATLAB源码-第83期】基于matlab的MIMO中V-BALST结构ZF和MMSE检测算法性能误码率对比。

操作环境: MATLAB 2022a 1、算法描述 在多输入多输出(MIMO)通信系统中,V-BLAST(垂直波束形成层间空间时间编码技术)是一种流行的技术,用于提高无线通信的数据传输速率和容量。它通过在不同的…

ESP32 MicroPython 蜂鸣器及传感器的使用⑦

ESP32 MicroPython 蜂鸣器及传感器的使用⑦ 1、蜂鸣器奏乐2、实验目的3、实验内容5、实验结果6、小车传感器应用7、实验目的8、实验内容9、参考代码10、实验结果 1、蜂鸣器奏乐 我们小车底板配置有蜂鸣器,下面我们来学习如何去利用蜂鸣器演奏乐曲 2、实验目的 学…

基于适应度相关算法优化概率神经网络PNN的分类预测 - 附代码

基于适应度相关算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于适应度相关算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于适应度相关优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针…

【机器学习12】集成学习

1 集成学习分类 1.1 Boosting 训练基分类器时采用串行的方式, 各个基分类器之间有依赖。每一层在训练的时候, 对前一层基分类器分错的样本, 给予更高的权重。 测试时, 根据各层分类器的结果的加权得到最终结果。 1.2 Bagging …

SQL INSERT INTO 语句详解:插入新记录、多行插入和自增字段

SQL INSERT INTO 语句用于在表中插入新记录。 INSERT INTO 语法 可以以两种方式编写INSERT INTO语句: 指定要插入的列名和值: INSERT INTO 表名 (列1, 列2, 列3, ...) VALUES (值1, 值2, 值3, ...);如果要为表的所有列添加值,则无需在SQL…

十七、Linux的组管理

1、Linux组基本介绍 在linux中的每个用户必须属于一个组,不能独立于组外。在linux中每个文件所有者、所在组、其它组的概念 1.所有者 2.所在组 3.其他组 4.改变用户所在的组 2、文件/目录 所有者 一般为文件的创建者,谁创建了该文件,就自…

Redis篇---第八篇

系列文章目录 文章目录 系列文章目录前言一、说说 Redis 哈希槽的概念?二、Redis 常见性能问题和解决方案有哪些?三、假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?前言 前些天发现了一个巨牛的人工智能学习网站…

局域网内Ubuntu上搭建Git服务器

1.在局域网内选定一台Ubuntu电脑作为Git服务端: (1).新建用户如为fbc,执行如下命令:需设置密码,此为fbc sudo adduser fbc (2).切换到fbc用户:需密码,此前设置为fbc su fbc (3).建一个空目录作为仓…

卷积、卷积图像操作和卷积神经网络

好多内容直接看书确实很难坚持,就比如这个卷积,书上的一大堆公式和图表直接把人劝退,我觉得一般的学习流程应该是自顶向下,先整体后局部,先把握大概再推敲细节的,上来就事无巨细地展示对初学者来说很痛苦。…

MatrixOne 实战系列回顾 | 建模与多租户

本次分享主要介绍MatrixOne建模与多租户相关内容。 1 建模 #1 与MySQL的区别 使用create table语句建表和MySQL建表语句基本相同,也有几点要注意。 MatrixOne暂不支持空间数据类型,其他数据类型在保持与 MySQL 命名一致的情况下,在精度与…

力扣 字母异位词分组 哈表 集合

👨‍🏫 力扣 字母异位词分组 ⭐ 思路 由于互为字母异位词的两个字符串包含的字母相同,因此对两个字符串分别进行排序之后得到的字符串一定是相同的,故可以将排序之后的字符串作为哈希表的键。 🍑 AC code class Solut…

Nginx的核心配置文件

Nginx的核心配置文件 学习Nginx首先需要对它的核心配置文件有一定的认识&#xff0c;这个文件位于Nginx的安装目录/usr/local/nginx/conf目录下&#xff0c;名字为nginx.conf 详细配置&#xff0c;可以参考resources目录下的<<nginx配置中文详解.conf>> Nginx的核…