深入浅出mediasoup—关键帧请求

news2024/11/24 12:23:29

当丢包或者解码错误导致无法正确解码视频流,或者当一个新的接收者加入到视频通话时,需要一个关键帧来恢复和开始正常解码。关键帧请求机制是确保视频流在不可靠网络环境下能够恢复和维持高质量播放的关键技术之一,mediasoup 支持关键帧请求。

1. 静态结构

关键帧请求要发送到视频源端,因此会在 Producer 汇聚。如果只是简单转发关键帧请求,实现会非常简单。但服务器需要考虑关键帧请求频率限制以及关键帧请求失败处理。其中 KeyFrameReuqestDelayer 用来控制关键帧请求频率,PendingKeyFrameInfo 用来处理关键帧请求重试。

KeyFrameRequestManager 重要方法:

// 普通关键帧请求,要遵守延迟请求规则,请求频率受控制
void KeyFrameNeeded(uint32_t ssrc);

// 强制关键帧请求,立即请求关键帧
void ForceKeyFrameNeeded(uint32_t ssrc);

// 通知收到关键帧报文,做相关处理
void KeyFrameReceived(uint32_t ssrc);

2. 调用流程

Consumer 基于各种原因请求关键帧,请求最终会交给 KeyFrameRequestManager 处理,KeyFrameRequestManager 控制关键帧请求的频率,由 RtpStreamRecv 生成请求关键帧的 RTCP 报文,从关联的 Transport 发送出去。NackGenerator 在必要时也会请求关键帧,但其是直接向 RtpStreamRecv 请求,因此不受 KeyFrameRequestManager 控制。

3. 请求触发

在 mediasoup 中,关键帧请求在以下几个场景中被触发,以确保视频流的连续性和质量:

  • 应用请求

应用程序可以通过 mediasoup 信令通道发送特定的命令来请求一个新的关键帧。这通常用于自定义场景下,需要手动触发关键帧请求。

  • PLI/FIR 请求

接收端检测到视频流丢帧或者解码错误时,会通过RTCP发送 PLI(Picture Loss Indication)或 FIR(Full Intra Request)消息给发送端。mediasoup 会处理这些 RTCP 请求,并指示发送端生成并发送一个新的关键帧。

  • 新用户加入

当新用户加入并成功连接到 mediasoup 的 Transport 时,需要一个关键帧来开始视频解码和显示。mediasoup 会自动触发一个关键帧请求,以确保新用户能够立即看到视频内容。

  • SVC 切换分层

在使用 SVC 时,不同的分层提供不同质量和分辨率的视频。当 SvcConsumer 切换到不同的分层时,可能需要一个关键帧来同步和显示新的分层视频内容。mediasoup 会在这种情况下自动触发一个关键帧请求。

  • NackGenerator

NackGenerator 在 NACK 请求队列无法腾挪出位置插入新的 NACK 请求时,会清空 NACK 请求队列,并发送关键帧请求。

4. 请求控制

4.1. 频率控制

关键帧请求如果太频繁,会对发送端性能和网络造成影响,有必要对关键帧请求频率进行控制。通常的做法是设置关键帧请求的最小时间间隔。mediasoup 关键帧请求频率控制是通过 KeyFrameRequestDelayer 实现的。

Consumer 在请求关键帧时,KeyFrameRequestManager 会立即发送关键帧请求并创建一个 KeyFrameRequestDelayer 对象,KeyFrameRequestDelayer 对象的生存期设置为关键帧请求时间间隔。如果在 KeyFrameRequestDelayer 对象生存期内,没有其他关键帧请求,KeyFrameRequestDelayer 对象到期后会自动销毁。

KeyFrameRequestDelayer 对象销毁后,一切重新开始,新的关键帧请求会创建新的 KeyFrameRequestDelayer 对象。

如果在 KeyFrameRequestDelayer 对象生存期内,有新的关键帧请求(一个或多个)到来,此时,不会立即触发新的关键帧请求,代之以设置 KeyFrameRequestDelayer 的 keyFrameRequested 标志。KeyFrameRequestDelayer 对象在销毁的时候,会检查 keyFrameRequested 标志,如果置位则会重新启动一次关键帧请求。

强制关键帧请求比较暴力,因为要的急,需要立即发送关键帧请求,不管三七二十一,如果有延迟器,删除重建。

4.2. 超时控制

关键请求如果超时未响应,不能不了了之,需要重新请求,但也不能无限重试。mediasoup 的策略是重新请求一次,如果还是没有响应,那也无能为力了。mediasoup 的关键帧请求的超时控制是通过 PendingKeyFrameInfo 实现的。

KeyFrameRequestManager 发送关键帧请求时,会对应创建一个 PendingKeyFrameInfo 对象。PendingKeyFrameInfo 内部会启动一个定时器,默认时长是 1 秒。如果在 1 倍超时时间内收到关键帧,则会删除此 PendingKeyFrameInfo 对象。

如果在 1 倍超时时间内没有收到关键帧,则会重发关键帧请求,并设置超时后不再重试的标志。如果在 2 倍超时时间内收到关键帧,删除 PendingKeyFrameInfo 对象。

如果在 2 倍超时时间内没有收到关键帧,则删除 PendingKeyFrameInfo 对象,不再重试。

如果在 1 倍超时时间内,有针对此 ssrc 的新的关键帧请求,不会影响超时重试逻辑。

但如果在 2 倍超时时间内,有针对此 ssrc 的新的关键帧请求,则会延长 PendingKeyFrameInfo 对象 1 倍超时时间的生存期。这对后来的关键帧请求比较公平。

5. 重要方法

本文详细讲解了 mediasoup 关键帧请的流程和控制原理,尽量少讲代码,多讲思路和逻辑。对于关键帧请求的场景只是进行了简单总结,没有深入分析,这部分会放到媒体转发章节讲述。mediasoup 实现关键帧请求控制的设计非常巧妙,代码实现小巧精简,是服务器关键帧请求实现的优秀范本,值得大家借鉴。

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

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

相关文章

一文掌握YOLOv1-v10

引言 YOLO目标检测算法,不过多介绍,是基于深度学习的目标检测算法中最出名、发展最好的检测器,没有之一。本文简要的介绍一下从YOLOv1-YOLOv10的演化过程,详细技术细节不过多介绍,只提及改进点,适合初学者…

每日OJ_牛客_HJ91 走方格的方案数

目录 牛客HJ91 走方格的方案数 解析代码 牛客HJ91 走方格的方案数 走方格的方案数_牛客题霸_牛客网 解析代码 本题为求取路径总数的题目,一般可以通过递归求解,对于复杂的问题,可以通过动态规划求解。此题比较简单,也可以通过递…

AI学习记录 - transformer的位置编码的理解

看完肯定懂,可能会更新 一看位置编码公式,感觉很懵逼 懵逼四点:(或者你还有其他不懂的点) 1、为什么使用正弦余弦公式?不可以使用其他公式? 2、为什么奇数位置使用余弦,偶数位置使…

向量数据库:从0到original paper

向量数据库相关概念 亿点点历史知识 LLM的模型发展历史,Harnessing the Power of LLMs in Practice: A Survey on ChatGPT and Beyond1: 很多人都是从ChatGPT爆点后才逐渐了解到大模型,但在爆点的前几年大模型的发展已经开始了诸神之战。一…

网络服务综合项目(一键部署shell脚本)

目录 需求: 主机环境描述 注意: 项目需求: 代码讲解 配置本地仓库 安装软件包 配置防火墙 配置策略中的一个布尔值 配置web服务 配置网络仓库 配置DNS服务 配置NTP服务 配置MySQL服务 配置NFS服务 配置论坛服务 进入网站配置…

数据结构(稀疏数组)

简介 稀疏数组是一种数据结构,用于有效地存储和处理那些大多数元素都是零或者重复值的数组。在稀疏数组中,只有非零或非重复的元素会被存储,从而节省内存空间。 案例引入 假如想把下面这张表存入文件,我们会怎么做?…

C语言字符函数与字符串函数超详解

文章目录 前言1. 字符分类函数2. 字符转换函数3. strlen3. 1 strlen 的使用3. 2 strlen 的模拟实现 4. strcpy4. 1 strcpy 的使用4. 2 strcpy 的模拟实现 5. strcat5. 1 strcat 的使用5. 2 strcat 的模拟实现 6. strcmp6. 1 strcmp 的使用6. 2 strcmp 的模拟实现 7. strncpy 函…

如何获得某个Window画面所属包名packageName和用户userId

在安卓上获得某个Window画面所属包名packageName和用户userId的方法 1,用到的工具如下: adb androidSDK里的monitor工具 adb shell dumpsys window animator adb shell dumpsys window命令 jdk 1.8已在安卓14模拟器上测试通过。 以AOSP的launcher中的m…

Nacos适配达梦数据库并制作镜像

背景:因项目需要信创,需将原本的mysql数据库,改成达梦数据库 一、部署达梦数据库 1.1 部署达梦数据库服务 可参考:Docker安装达梦数据库_达梦数据库docker镜像-CSDN博客 1.2 创建nacos数据库 create user SAFE_NACOS identifi…

pythonGame-实现简单的贪食蛇游戏

通过python简单复现贪食蛇游戏。 使用到的库函数: import pygame import time import random 游戏源码: import pygame import time import randompygame.init()white (255, 255, 255) yellow (255, 255, 102) black (0, 0, 0) red (213, 50, 80…

【秋招突围】2024届秋招笔试-美团笔试题-第一套-三语言题解(Java/Cpp/Python)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新 美团 春秋招笔试题**汇总~ 👏 感谢大家的订阅➕ 和 喜欢💗 01.LYA 的音乐播放列表 问题描述 LYA 有一个包含 n n n 首歌曲的音乐播放列表,歌曲编号从 1 1

护网紧急情况应对指南:Linux 应急响应手册

继上一篇:护网紧急情况应对指南:Windows版v1.2全新升级版 之后 收到小伙伴后台要Linux应急手册,今天给大家安排上。 《Linux应急手册》是一本为Linux系统管理员和运维工程师量身打造的实用指南,旨在帮助他们快速应对各种突发状况…

电测量数据交换DLMSCOSEM组件第10部分:智能测量标准化框架

1.GB/T 17215.6XY系列 IEC 62056 DLMS/COSEM组件标准已经由IEC/TC 13完成制定,用于电测量的目的。有些标准——特别是COSEM数据模型——也已经被其他非电量测量的技术委员会使用。IEC62056-X-Y系列标准对应转换国标GB/T 17215.6XY系列(电测量数据交换DLMSCOSEM组件)。如下图…

Electron的入门介绍与使用(1)共30节

Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验。 入门指南​ Electron 是网页应用 …

repo 工具安装和使用教程(windows+gitee)

repo是什么 官方的定义:Repo是谷歌用python脚本写的调用git的一个脚本,可以实现管理多个git库。 Android的源代码使用Repo 命令行工具来管理多个git仓库,大概有百多个。要想克隆和管理百多个 Git 仓库,不是一件简单的事情。Repo 命…

Java集合——HashMap的底层实现

HashMap将数据以键值对的形式存储,是线程不安全的(即在多线程中若不用concurrentHashMap会导致结果错误)。 // concurrentHashMap编程示例 import java.util.Map; import java.util.concurrent.ConcurrentHashMap;public class HashMapThrea…

快手电商Android一面凉经(2024)

快手电商Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《快手电商Android一面凉经(2024)》。 面试职位: Android工程师 技术一面 面试形式…

新手小白的pytorch学习第十四弹------十一、十二、十三弹卷积神经网络CNN的习题

习题编号目录 No 1No 2No 3No 4No 5No 6No 7No 8No 9No 10No 11No 12No 13 练习题主要就是 写代码,所以这篇文章大部分是代码哟~ No 1 What are 3 areas in industry where computer vision is currently being used? No 2 工业异常检测,目标检测 Sea…

C语言 -- sizeof和strlen的用法

C语言 -- sizeof和strlen的用法 1. sizeof和strlen的对比​1.1 sizeof​1.2 strlen​1.3 sizeof 和 strlen的对比​ 2. 数组和指针笔试题解析2.1 一维数组​2.2 字符数组​2.3 二维数组 3. 指针运算笔试题解析3.1 题目1:3.2 题目2​3.3 题目3​3.4 题目4​3.5 题目5…

力扣高频SQL 50题(基础版)第十九题

文章目录 力扣高频SQL 50题(基础版)第十九题1211. 查询结果的质量和占比题目说明思路分析实现过程准备数据实现方式结果截图 力扣高频SQL 50题(基础版)第十九题 1211. 查询结果的质量和占比 题目说明 Queries 表: …