16.live555mediaserver-保活机制

news2024/11/18 1:26:36

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.coloradmin.cn/o/1226541.html

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

相关文章

.Net中Redis的基本使用

前言 Redis可以用来存储、缓存和消息传递。它具有高性能、持久化、高可用性、扩展性和灵活性等特点,尤其适用于处理高并发业务和大量数据量的系统,它支持多种数据结构,如字符串、哈希表、列表、集合、有序集合等。 Redis的使用 安装包Ser…

Windows网络「SSL错误问题」及解决方案

文章目录 问题方案 问题 当我们使用了神秘力量加持网络后,可能会和国内的镜像源网站的之间发生冲突,典型的有 Python 从网络中安装包,如执行 pip install pingouin 时,受网络影响导致无法完成安装的情况: pip config…

【小沐学GIS】电子海图OpenCPN源代码编译和运行(VS2017 + Win10)

1、简介 免费的开源海图仪和船用GPS导航软件 https://opencpn.org/ 1.1 OpenCPN概述 OpenCPN是一款自由软件(GPLv2),用于创建简洁的海图绘图仪和导航软件,可以在航行过程中使用或者作为计划工具。OpenCPN提供大量免费海图下载&a…

一文总结MySQL的指令是如何工作的

当你输入一条MySQL指令时候有没有想过会发生什么? 建立连接 首先你得先连到数据库上才行,这又分为长连接和短链接,短链接就是你查询一次就断开连接,长连接是你可以多次查询直到主动断开连接(也可能被杀死进程&#x…

飞鼠异地组网工具实战之访问k8s集群内部服务

飞鼠异地组网工具实战之访问k8s集群内部服务 一、飞鼠异地组网工具介绍1.1 飞鼠工具简介1.2 飞鼠工具官网 二、本次实践介绍2.1 本次实践场景描述2.2 本次实践前提2.3 本次实践环境规划 三、检查本地k8s集群环境3.1 检查k8s各节点状态3.2 检查k8s版本3.3 检查k8s系统pod状态 四…

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

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

消息通讯-MQTT WebHookSpringBoot案例

一、EMQX WebHook介绍 1、EMQX WebHook 是由 emqx_web_hook (opens new window)插件提供的将EMQX中的钩子事件通知到某个Web服务的功能。 2、WebHook 的内部实现是基于钩子,借助 Webhook 可以完成设备在线、上下线记录,订阅与消息存储、消息送达确认等诸…

【Spring Boot 源码学习】Banner 信息打印流程

Spring Boot 源码学习系列 Banner 信息打印流程 引言往期内容主要内容1. printBanner 方法2. 关闭 Banner 信息打印3. SpringApplicationBannerPrinter 类3.1 LOG 模式打印3.1.1 getBanner 方法3.1.1.1 新建 Banners3.1.1.2 添加 ImageBanner3.1.1.3 添加 ResourceBanner3.1.1.…

Flume的安装部署及常见问题解决

1.安装地址 (1) Flume官网地址:http://flume.apache.org/ (2)文档查看地址:http://flume.apache.org/FlumeUserGuide.html (3)下载地址:http://archive.apache.org/dist…

RVC从入门到......

RVC变声器官方教程:10分钟克隆你的声音!一键训练,低配显卡用户福音!_哔哩哔哩_bilibili配音:AI逍遥散人(已授权)关注UP主并私信"RVC"(三个字母)自动获取一键训…

PS 颜色取样器标尺工具 基本使用讲解

上文 PS 吸管工具基本使用方法 我们讲完了 吸管工具 那么 我们继续 打开ps先 接着 我们选择这个 颜色取样器工具 选择之后 我们鼠标在图像上随便点一下 就会出现一个标记 然后 我们可以点多几个地方 边上的信息面板就会输出 点1 和 点2 甚至 多个 点3 点4 的 颜色 RGB代码 …

Python 如何实现备忘录设计模式?什么是备忘录设计模式?Python 备忘录设计模式示例代码

什么是备忘录(Memento)设计模式? 备忘录(Memento)设计模式是一种行为型设计模式,用于捕获一个对象的内部状态,并在对象之外保存这个状态,以便在需要时恢复对象到先前的状态。这种模…

[qemu逃逸] DefconQuals2018-EC3

前言 一道简单的套壳堆题.原本题目环境为 ubu16, 我这里使用的是 ubu18 设备逆向 qemu-system-x86_64 只开了 Canary 和 NX 保护. 比较简单, 主要逻辑在 mmio_write 里面, 其实现了一个菜单堆, 具有增删改的功能: 但是在释放堆块时并没有置空, 所以这里存在 UAF. 而程序还直…

三、程序员指南:数据平面开发套件

定时器库 定时器库为DPDK执行单元提供了定时器服务,以便异步执行回调函数。该库的特点包括: 定时器可以是周期性的(多次触发)或单次的(一次性触发)。定时器可以从一个核加载并在另一个核上执行。这必须在…

IntelliJ IDEA 2023 v2023.2.5

IntelliJ IDEA 2023是一款功能强大的集成开发环境(IDE),为开发人员提供了许多特色功能,以下是其特色介绍: 新增语言支持:IntelliJ IDEA 2023新增对多种编程语言的支持,包括Kotlin、TypeScript、…

介绍交换空间概念以及如何设置交换空间

文章目录 什么交换空间新增交换空间 什么交换空间 交换空间(Swap space)是计算机内存的一种补充,位于硬盘驱动器上。当物理内存不足时,系统会将不活跃的页面移到交换空间中。 交换空间可以帮助系统在以下情况下运行&#xff1a…

mysql 实现去重

个人网站 首发于公众号小肖学数据分析 1、试题描述 数据表user_test如下,请你查询所有投递用户user_id并且进行去重展示,查询结果和返回顺序如下 查询结果和返回顺序如下所示 解题思路: (1) 对user_id列直接去重: &#xff…

Kotlin学习(一)

Kotlin学习&#xff08;一&#xff09; 1.使用IDEA构建Kotlin项目 新建工程即可 我这里选择的Build System是IntelliJ&#xff0c;虽然我没用过但是这是Kotlin基础学习应该不会用到其他依赖 2.Hello World package com.simonfun main(args:Array<String>){println(&q…

Go 语言中切片的使用和理解

切片与数组类似&#xff0c;但更强大和灵活。与数组一样&#xff0c;切片也用于在单个变量中存储相同类型的多个值。然而&#xff0c;与数组不同的是&#xff0c;切片的长度可以根据需要增长和缩小。在 Go 中&#xff0c;有几种创建切片的方法&#xff1a; 使用[]datatype{val…

使用 C 语言快速排序将字符串按照 ASCII 码升序排列

示例代码&#xff1a; #include <stdio.h> #include <string.h> #include <stdlib.h>static Comp(const void *a, const void *b) {char *pa (char *)a;char *pb (char *)b;return strcmp(a, b); }int main(void) {char strs[3][10] { "bd", &q…