webrtc gcc算法(1)

老的webrtc gcc算法,大概流程:

这两个拥塞控制算法分别是在发送端和接收端实现的, 接收端的拥塞控制算法所计算出的估计带宽, 会通过RTCP的remb反馈到发送端, 发送端综合两个控制算法的结果得到一个最终的发送码率,并以此码率发送数据包。

Loss-Based Controller在发送端负责基于丢包的拥塞控制,它的输入比较简单, 只需要根据从接收端反馈的丢包率, 就可以做带宽估算; 上图右侧比较复杂, 做的是基于延迟的带宽估计, 这也是本文后面主要介绍的部分。在最近的WebRTC实现中, GCC把它的两种拥塞控制算法都移到了发送端来实现, 但是两种算法本身并没有改变,只是在发送端需要计算延迟, 因而需要一些额外的feedback信息, 为此WebRTC扩展了RTCP协议, 其中最主要的是增加了Transport-CC Feedback,该包携带了接收端接收到的每个媒体包的到达时间。

基于延迟的拥塞控制比较复杂, WebRTC使用延迟梯度来判断网络的拥塞程度,延迟梯段的概念后文会详细介绍;其算法分为几个部分:

  • 到达时间滤波器
  • 过载检测器
  • 速率控制器

在获得两个拥塞控制算法分别结算到的发送码率之后, GCC最终的发送码率取的是两种算法的最小值。下面我们详细介绍WebRTC的拥塞控制算法GCC。

一、基于丢包的带宽估计

基于丢包的拥塞控制比较简单, 其基本思想是根据丢包的多少来判断网络的拥塞程度, 丢包越多则认为网络越拥塞, 那么我们就要降低发送速率来缓解网络拥塞;如果没有丢包,这说明网络状况很好, 这时候就可以提高发送码率, 向上探测是否有更多的带宽可用。实现该算法有两点:一是获得接收端的丢包率, 一是确定降低码率和提升码率的阈值。

WebRTC通过RTCP协议的Receive Report反馈包来获取接收端的丢包率。Receive Report包中有一个fraction lost 字段, 包含了接收端的丢包率,如下图所示。

发送端接收RR报文,并根据丢包率调整估计带宽As

  1. 如果丢包率 < 2%,估计带宽在以前的基础上增长5%;
  2. 如果丢包率在[2%, 10%]之间,估计带宽保持不变;
  3. 如果丢包率 > 10%,估计带宽在以前的基础上降低(丢包率 * 50%)

而这部分的丢包则需要通过其他的如NACK或FEC等手段来恢复。

二、基于延迟梯度的带宽估计

WebRTC实现的基于延迟梯度的带宽估计有两种版本:

  • 最早一种是在接受端实现,评估的带宽结果通过RTCP REMB消息反馈到发送端。 在此种实现中, 为了准确计算延迟梯度,WebRTC添加了一种RTP扩展头部abs-send-time, 用来表示每个RTP包的精确发送时间, 从而避免发送端延迟给网络传播延迟的估计带来误差。这种模式也是RFC和google的paper中描述的模式。
  • 在新近的WebRTC的实现中,所有的带宽估计都放在了发送端, 也就说发送端除了做基于丢包的带宽估计, 同时也做基于延迟梯度的带宽估计。 为了能够在接受端做基于延迟梯度的带宽估计, WebRTC扩展了RTP/RTCP协议, 其一是增加了RTP扩展头部, 添加了一个session级别的sequence number, 目的是基于一个session做反馈信息的统计, 而不紧紧是一条音频流或视频流; 其二是增加了一个RTCP反馈信息transport-cc-feedback, 该消息负责反馈接受端收到的所有媒体包的到达时间。接收端根据包间的接受延迟和发送间隔可以计算出延迟梯度,从而估计带宽。

关于如何根据延迟梯度推断当前网络状况, 后面会分几点详细展开讲, 总体来说分为以下几个步骤:

  • 到达时间滤波器
  • 过载检测器
  • 速率控制器

其过程就是, 到达时间滤波器根据包间的到达时延和发送间隔,计算出延迟变化, 这里会用到卡尔曼滤波对延迟变化做平滑以消除网络噪音带来的误差;延迟变化会作为过载检测器的输入,由过载检测器判断当前网络的状态,有三种网络状态返回overuse/underuse/normal,检测的依据是比较延迟变化和一个阈值, 其中该阈值非常关键且是动态调整的。最后根据网络状态的变化, 速率控制器根据一个带宽估计公式计算带宽估计值。

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

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

相关文章

iZotope RX 10for Mac /Windows- 音频修复的终极解决方案

随着音乐和电影制作的复杂性日益增加&#xff0c;高质量的音频修复变得越来越重要。iZotope RX 10&#xff0c;作为业界公认的专业音频修复软件&#xff0c;为你提供了强大、精确的工具&#xff0c;让你的声音变得清晰、纯净。 在音频修复领域&#xff0c;iZotope RX 10凭借其…

Python 简单并发的代码记录

简单介绍 近期想优化一下API的请求&#xff0c;顺带测试一下并发编程能快多少&#xff0c;用到进程、线程&#xff0c;顺带保留一些直接可用的简单的并发代码&#xff0c;方便后期复制粘贴 1、urllib3 网络请求 2、获取函数执行时间&#xff08;大致的&#xff09; 3、进程的…

国产低功耗MCU芯片:Si24R03

Si24R03集成了基于RISC-V核的低功耗MCU和工作在2.4GHz ISM频段的无线收发器模块&#xff0c;是一款高度集成的低功耗SOC片。 应用领域&#xff1a; 1、物联网 2、智N门锁 3、电机控制 4、消费电子 5、工业控制 其无线收发器模块是专为低功耗无线场合设计&#xff0c;在关…

maven聚合和继承

一、什么是maven的聚合和继承&why 随着技术飞速发展&#xff0c;各类用户对软件的要求越来越高&#xff0c;软件也变得越来越复杂。 软件设计人员往往会采用各种方式对软件划分模块&#xff0c;已得到更加清晰的设计及更高的复用性。 当把Maven应用到实际项目中的时候&am…

CCF ChinaSoft 2023 论坛巡礼|形式验证@EDA论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

uni-app:实现当前时间的获取,并且根据当前时间判断所在时间段为早上,下午还是晚上

效果图 核心代码 获取当前时间 toString()方法将数字转换为字符串 padStart(2, 0)&#xff1a;padStart()方法用于在字符串头部填充指定的字符&#xff0c;使其达到指定的长度。该方法接受两个参数&#xff1a;第一个参数为期望得到的字符串长度&#xff0c;第二个参数为要填充…

pytorch教程

文章目录 1 pytorch的安装2 PyTorch基础知识2.1 张量简介2.2 初始化2.3 张量的属性2.4 ndarray与tensor互转2.5 索引、切片、变形、聚合、矩阵拼接、切割、转置 3 pytorch自动微分4 线性回归5 分类5.1 写法一5.2 写法二 1 pytorch的安装 pytorch官网 https://pytorch.org/get-…

【C++程序员必修第一课】C++基础课程-12:std::array 固定数组

1 本课主要内容&#xff1a; std::array 固定数组的声明基本使用&#xff1a;赋值、访问数组、遍历等 2 主要知识点&#xff1a; std::array 固定数组的声明 #include <array>// std::array 固定数组例子 std::array<int, 5> array1; // 未…

5256C 5G终端综合测试仪

01 5256C 5G终端综合测试仪 产品综述&#xff1a; 5256C 5G终端综合测试仪主要用于5G终端、基带芯片的研发、生产、校准、检测、认证和教学等领域。该仪表具备5G信号发送功能、5G信号功率特性、解调特性和频谱特性分析功能&#xff0c;支持5G终端的产线高速校准及终端发射机…

Simple RPC - 02 通用高性能序列化和反序列化设计与实现

文章目录 概述设计实现通用的序列化接口通用的序列化实现【推荐】 vs 专用的序列化实现专用序列化接口定义序列化实现 概述 网络传输和序列化这两部分的功能相对来说是非常通用并且独立的&#xff0c;在设计的时候&#xff0c;只要能做到比较好的抽象&#xff0c;这两部的实现…

Linux高性能服务器编程——ch5笔记

第5章 Linux网络编程基础API 5.1 socket地址API 主机字节序&#xff08;小端字节序&#xff09;&#xff1a;整数的高位字节存储在内存的高地址处&#xff0c;而低位字节则存储在内存的低地址处。 网络字节序&#xff08;大端字节序&#xff09;&#xff1a;相反。 void byt…

全光谱护眼灯有哪些?2023全光谱护眼台灯推荐

随着电子设备的不断普及&#xff0c;手机、平板电脑、显示器、电视机等几乎是家家户户的必备品&#xff0c;也正因为眼睛有那么多时间、那么多机会去盯着屏幕&#xff0c;所以如今近视低龄化现象也越来越严重了。随着科技的不断发展&#xff0c;台灯的发展也越来越多样化&#…

成都瀚网科技有限公司:开抖音店铺有哪些注意事项?

成功经营一个小店不仅仅是发布产品视频那么简单&#xff0c;还需要注意一些重要的事情。开抖音店铺需要注意以下几点&#xff1a; 1、开抖音店铺有哪些注意事项&#xff1f; 合规管理&#xff1a;在抖音开店&#xff0c;首先要确保自己的运营合规。遵守相关法律法规及平台规定&…

关于yield你只需要知道这2点

1.yield是放在函数里面的&#xff0c;且带有yield的函数就叫做生成器&#xff0c;这时函数就成了一个对象&#xff0c;而不能把它作为函数来对待 def foo(num):print("introduction:")while:if num < 10:num 1yield num g foo()看上面的代码&#xff0c;我们把…

Python 基础问题

文章目录 python 中有哪些类型或数据结构什么是有序和无序什么是可变和不可变字典中&#xff0c;什么类型可以当做key去使用闭包是什么装饰器是什么 python 中有哪些类型或数据结构 在 Python 中&#xff0c;有多种类型和数据结构可用于存储和组织数据。以下是一些常见的类型和…

golang——工程组件logrus日志记录框架(结构化记录,支持文件切割,hook)

logrus 介绍一个golang 日志框架logrus 支持文本与JSON数据格式支持结构化记录支持hook 文档介绍 logrus文档 std 官方案例介绍了如何配置std打印 package mainimport ("os"log "github.com/sirupsen/logrus" )func init() {// Log as JSON instead…

Unoconv入门介绍和问题汇总

简介&#xff1a;Unoconv是一款基于LibreOffice/ Openoffice开发的命令行工具&#xff0c;可以将不同格式的文件&#xff08;如DOC、PPT、PDF等&#xff09;在不同的操作系统上通过Libreoffice/Openoffice转换为PDF、ODT、DOC、PNG、PPTX等格式&#xff0c;并支持在命令行中指定…

Elasticsearch学习笔记

1.核心概念 bucket: 一个数据分组&#xff08;类似于sql group by以后的数据&#xff09;metric&#xff1a;对bucket执行的某种聚合分析的操作&#xff0c;比如说求平均值&#xff0c;最大值&#xff0c;最小值。一些系列的统计方法(类似 select count(1) MAX MIN AVG) 请…

CUDA学习笔记5——CUDA程序错误检测

CUDA程序错误检测 所有CUDA的API函数都有一个类型为cudaError_t的返回值&#xff0c;代表了一种错误信息&#xff1b;只有返回cudaSuccess时&#xff0c;才是成功调用。 cudaGetLastError()用来检测核函数的执行是否出错cudaGetErrorString()输出错误信息 #include <stdi…

【lesson13】进程控制初识

文章目录 进程创建 进程创建 请你描述一下&#xff0c;fork创建子进程操作系统都做了什么&#xff1f; fork创建子进程&#xff0c;系统里多了一个进程&#xff0c;进程 内核数据结构 进程代码数据&#xff0c;内核数据结构由OS维护&#xff0c;进程代码数据一般由磁盘维护。…