当前位置: 首页 > news >正文

WebRTC Qos策略

1.WebRTC 用于提升 QoS 的方法:


NACK、FEC、SVC、JitterBuffer、IDR Request、PACER、Sender Side BWE、VFR(动态帧率调整策略)

https://blog.csdn.net/CrystalShaw/article/details/80432267

丢包重传

NACK:一种通知技术,和ACK相反,通知未达

FMT=1, PT=RTPFB

a=rtcp-fb:96 nack

RTX:参考rfc4588,使用额外的 ssrc 传输,在sdp中标识

a=rtpmap:97rtx/90000

a=ssrc-group:FID2736695910239189782

RPSI:无

NACK 可以节省带宽,但会带来延迟*

谈谈网络通信中的ACK,NACK 和 REX](https://link.zhihu.com/?target=https%3A//blog.51cto.com/ticktick/2468581)

丢包恢复(冗余编码 前向纠错 FEC)**通过 FEC 协议实现:RED:RFC2198, 封装FEC冗余报文UlpFEC: RFC5109,报文异或,生成冗余打包;带宽占用大,连续丢包,随机丢包FLEXFEC: 草案, 更灵活,引入交织算法,增加纵向OXR运算,增加网络抗丢包能力。

a=rtpmap:116 red/90000a=rtpmap:117 ulpfec/90000

FEC由于通过冗余纠错,所以延迟比较低,但浪费带宽*

https://blog.csdn.net/CrystalShaw/article/details/83413772

根据丢包率动态调整冗余度。

关键帧请求(IDR)**严重丢包时可以通过发送关键帧请求进行画面恢复。关键帧请求方式包括三种:RTCP FIR:使用 RTCP Feedback 消息请求关键帧(完整帧)RTCP PLI:关键帧丢包重传SIP Info:

a=rtcp-fb:100 ccm fira=rtcp-fb:96 nack pli

Jitter Buffer 抖动缓冲区将收到的RTP报文缓存起来,按照时间戳或者序号重排,消除报文乱序和抖动问题。

分为静态和动态,动态 Jitter Buffer 根据网络环路延时情况,动态调整缓存大小。

Jitter buffer 核心思想是用时间换空间,以增大端到端延时为代价,换取视频通话的流畅性。 当网络抖动发生时,增加Buffer长度,以应对可能发生的抖动;当网络稳定时,减少buffer长度,降低视频端到端延迟,提高实时性。(尽量保证视频不卡的前提下,降低端到端延迟,在延迟和卡顿率之间平衡)

流程**:组帧--帧排序--检查帧参考关系--计算抖动(时间戳)--根据抖动计算buffer长度--根据抖动自适应调整buffer长度

Pacer 网络报文平滑策略**视频帧可能分别封装在多个RTP报文,若这个视频帧RTP报文同时发送到网络,必然会导致网络瞬间拥塞。PACER 就是实现把RTP同一时刻产生的若干包,周期性的发送,防止上行流量激增导致拥塞。让视频数据按照评估码率均匀的分布在各个时间片里发送。

削峰填谷; 将报文平滑地发送给接收端。在弱网环境尤其重要。

根据 estimator 计算的码率,来计算发包频率

WebRTC中pacer的流程比较清晰,分为三步:1)如果一帧图像被编码和RTP切分打包后,先会将RTP报文存在待发送的队列中,并将报文元数据(packet id, size, timestamp, 重传标示)送到pacer queue进行排队等待发送,插入队列的元数据会进行优先级排序。2)pacer timer会触发一个定时任务事件来计算budget,budget会算出当前时间片网络可以发送多少数据,然后从pacer queue当中取出报文元数据进行网络发送。3)如果pacer queue没有更多待发送的报文,但budget却还可以发送更多的数据,这个时候pacer会进行padding报文补充。

设置发送速率 PacedSender::SetEstimatedBitrate(bitrate_bps)*

包缓存队列;发包线程按一定间隔发包。

带宽评估和拥塞控制

https://mp.weixin.qq.com/s/Ej63-FTe5-2pkxyXoXBUTw

https://blog.csdn.net/CrystalShaw/article/details/82981183

https://blog.mozilla.org/webrtc/what-is-rmcat-congestion-control/

WebRTC 的拥塞控制和码率估计采用 GCC 算法。该算法充分考虑了网络丢包和网络延迟对码率估计的不同影响,分别基于丢包率和网络延迟进行码率估计,最后综合得出最优值。

算法实现上,基于丢包率的码率估计在发送端进行,基于网络延迟的码率估计在接收端进行。最后,在发送端计算出最优值,作用于Codec和PacedSender模块。GCC算法能够较好地基于网络实时状况估计网络带宽,为网络实时通信打下坚实基础。

GCC算法弊端:不能适应所有网络模型、应对网络峰值能力差。比如实时在线编辑场景。

M55 版本引进 Sendside-BWE 拥塞控制算法,把所有码率计算都移到发送端进行,并采用全新的 Trendline 滤波器取代之前的 Kalman 滤波器。能够更好更快的进行码率估计和网络过载恢复。

a=rtcp-fb:100 goog-remba=rtcp-fb:100 transport-cc

GCC 算法(Google Congestion Control)

https://www.jianshu.com/p/0f7ee0e0b3be

https://www.jianshu.com/p/5259a8659112

GCC拥塞控制算法主要分两部分:基于丢包检测的拥塞控制和 基于延时检测的拥塞控制。

其中,发送端基于丢包率的码率控制,接收端基于延迟的码率控制。

基于延迟检测和丢包反馈的拥塞机制(GCC)和带宽调节策略来保证延迟、质量和网路速度之间平衡

带宽估计,传输反馈机制

基于丢包率(loss-based )(发送端实现)发送端从接收端发送的 RTCP RR(Receiver Report)报文,根据 Report Block 中携带的丢包率信息,动态调整发送端码率。

通过丢包率信息以及计算RTT,并结合 TMMBR 或 REME 中携带的码率信息计算最终的码率值,然后媒体引擎根据码率配置编码器,实现码率自适应调整。

RTCP RR 反馈包,显示接收端丢包率,lost fraction 字段

基于延时带宽估计(delay-based) (接收端实现)

记录数据包时间戳,计算数据分组的延时变化,判断网络拥塞情况;最终评估码率,由 RTCP feedback(TMMBR 或 REME )报文 反馈给发送端。

WebRTC 新版本中,GCC算法将两种拥塞控制算法都在发送端实现。

基于延时的拥塞控制由三个模块组成:到达时间滤波器、过载检查器和速率控制器。

使用 Kalman filter(卡夫曼过滤器)带宽评估模型;WebRTC M55 新版本都是采用发送端的 trendline 滤波器来做延迟带宽评估

TMMBR

REME (Receiver Estimated Maximum Bitrate)

rtcp remb 消息反馈

Sendside-BWE 算法(Transport-CC Feedback)

M55 版本引进 Sendside-BWE 拥塞控制算法,把所有码率计算都移到发送端进行,并采用全新的 Trendline 滤波器取代之前的 Kalman 滤波器。能够更好更快的进行码率估计和网络过载恢复。

RTP头部扩展 TransportSequenceNumber ,代表传输序号(不同于媒体层序号,用于组帧和抗丢包),关注数据传输特性,用于码率估计。

接收端,通过检查头部是否有 TransportSequenceNumber 扩展,决定采用 Sendside-BWE 还是 GCC 算法。接收端的 EstimatorProxy 周期发送 Transport-CC 报文。

包括关键技术:包组延迟评估(InterArrival)、滤波器趋势判断(TrendlineEstimator)、过载检测(OveruseDetector)和码率调节(AimdRateControl)。

BBR 算法

BBR在实时视频领域应用

Google's BBR 拥塞控制算法模型解析

从TCP拥塞本质看BBR算法及其收敛性(附CUBIC的改进/NCL机制)

2.总结


3.音频QoS


以上部分,我们主要讨论 RTP 视频相关 Qos。这里,我们着重讨论音频相关Qos。

时延是语音通话的重要指标,时延低于150ms时人感觉不到,超过150ms且小于450ms时人能感受但不影响通话,当时延大于1s时将严重影响通话交流。

音频的时延包括:通信终端时延(采集、前处理、编码)、网络时延、通信终端与网络设备间时延。

发送端延时:采集延时、前处理算法延时、编码延时

网络延时:Jitter Buffer、FEC

接收端延时:网络延时、解码延时、后处理算法延时和播放延时。

减少延时方法:减少缓冲深度、加速信号处理算法(WSOLA、NetEQ)

WebRTC 音频相关两大核心技术:前后处理(3A,AEC/AGC/ANS)、netEQ。

此处主要介绍 netEQ 算法,3A算法在音频处理详细介绍。

netEQ

在 NetEQ 模块中,主要分为:MCU(微控制单元)和 DSP(数字信号处理)模块。

MCU:主要负责延时及抖动计算统计,并生成对应的控制命令;

DSP:主要负责接收并根据MCU控制命令进行对应的数据包处理。

浅谈WebRTC NetEQ

webrtc音频Qos汇总

抗丢包方法:NACK、FEC、交织编码

抗抖动方法:Jitter Buffer、音频平滑处理

4.Jitter Buffer


抗网络抖动由三个模块完成:网络延时统计算法、缓冲区延迟统计算法、控制命令决策判定。

webrtc 会根据网络延时(DelayManager)和缓冲区数据长度(Buffer Level Filter)以及上一帧的处理方式,决定给解码器发什么信号处理命令。

5.音频平滑处理方法


音频解码信号处理命令主要有五种:kNormal(正常播放)、kAccelerate(加速播放)、kExpand(减速播放)、kAlternativePlc(丢包补偿)、kMerge(融合)。

抗抖动方法尽量保证音频质量,但特定网络,音频渲染会出现音频数据堆积、断流现象。若不进行特殊处理,音频会时快时慢;所以引入音频不变调算法进行平滑处理。

在弱网丢包率比较高情况下,数据会长时间丢失,变速不变调算法也无法满足实际应用,webrtc又引入了丢包补偿、音频融合算法,衔接和平滑音频质量。

丢包补偿:根据前一帧的解码信息,利用基音同步重复的方法近似替代当前的丢失帧,以达到丢包补偿。

融合算法:当上一次播放的帧和当前解码的帧不连续的情况下,进行衔接和平滑处理。让两个数据包一部分播放时间重叠,使过度更自然。

原文 https://zhuanlan.zhihu.com/p/149675376

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

相关文章:

WebRTC Qos策略

1.WebRTC 用于提升 QoS 的方法:NACK、FEC、SVC、JitterBuffer、IDR Request、PACER、Sender Side BWE、VFR(动态帧率调整策略)https://blog.csdn.net/CrystalShaw/article/details/80432267丢包重传NACK:一种通知技术,…...

Mysql数据查询

文章目录1 group by子句2 回溯统计3 having子句1 group by子句 group by子句**:分组统计,根据某个字段将所有的结果分类,并进行数据统计分析 分组的目的不是为了显示数据,一定是为了统计数据group by子句一定是出现在where子句之…...

Kafka入门(五)

下面聊聊Kafka常用命令 1、Topic管理命令 以topic:test_1为例 1.1、创建topic ./bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 3 --partitions 3 --topic test_1参数说明: –bootstrap-server:…...

如何快速在windows系统中切换node.js版本

前言 最近在同时维护公司的两个项目,一个是新项目,另一个是老项目,二者所依赖的node版本是不一致的。 这就导致我在切换项目的时候必须重新安装对应版本的 node.js,否则就会报各种神马错误。 但这一卸一装可着实烦死个银&#xf…...

设计模式-单例模式(java)

单例是一种常用的设计模式,它的目的是确保一个类只有一个实例,并提供一个全局访问点。在Java编程语言中,实现单例有多种方法,本篇文章将介绍其中的两种实现方式。 方式一:饿汉式单例模式 饿汉式单例模式是最简单的实…...

Revit中复合墙图层的规则和CAD识别翻模墙

一、Revit中用于指定复合墙图层的规则,具体内容? 在编辑复合墙的结构时,请使用“指定图层”工具将“编辑部件”对话框中的行指定给图层或预览窗格中的区域,并遵循这些原则。 在预览窗格中,样本墙的各个行必须保持从左到右的顺序显…...

【DL】Paddle BML Codelab环境使用说明 - 知识点目录

《Paddle BML Codelab环境使用说明》 1. 编辑区 Code Cell 1.1 Code Cell 操作 Magic关键字/魔术命令 Magic命令含义%timeit测试单行语句的执行时间%%timeit测试代码块的执行时间%matplotlib inline显示matplotlib生成的图形%run调用外部python脚本%pdb 调试程序%pwd 查看当…...

python正则表达式处理文本-re模块

python正则表达式处理文本-re模块 1.概述 正则表达式通常用于含有大量文本处理的应用当中。例如,它们经常用作开发者使用的文本编辑程序的搜索模式,包括 vi,emacs 和现代集成开发环境。它们也是 Unix 命令行工具的组成部分,例如…...

换了固态硬盘需要重装系统吗?教你如何实现不重装系统!

电脑大家都用过嘛,如果您的计算机装的还是机械硬盘,想必阁下肯定是修身养性的高手,因为在这个浮躁的社会中,是很少有人能够忍受5分钟甚至更久的开机时间的,不仅开机慢,应用程序的响应速度也很慢&#xff0c…...

网上医疗预约挂号系统

技术:Java、JSP等摘要:网上医疗预约挂号系统是主要是对居民的保健、护理、疾病预防等健康信息实行有效的预约挂号管理。医疗机构为居民建立完整的健康档案,安排体检以及实施免疫等预防措施。而基于Web的远程保健平台以网上医疗预约挂号系统为…...

专题:一看就会的C++类模板讲解 (1)

目录 一.类模板的作用 二.类模板的定义: 三.类模板的声明格式: 四.类模板对象 五.再举一个例子 一.类模板的作用 面向对象的程序设计编程实践中,我们可能会面临这样的问题:要实现比较两个数的大小。明明比较两个数的方法都一样…...

什么是“奥卡姆剃刀”,如何用“奥卡姆剃刀”解决复杂问题?复杂问题简单化

什么是“奥卡姆剃刀”,如何用“奥卡姆剃刀”解决复杂问题?复杂问题简单化问题什么是“奥卡姆剃刀”?如何使用“奥卡姆剃刀”解决问题复杂问题简单化“汉隆剃刀”小结问题 假设你在夜空中看到一颗闪闪发光的「不明飞行物」,你认为这会是什么呢…...

角谷定理(递归)

已知有角谷定理: 输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。如:例如数据22的变化过程&#xff…...

数学小课堂:微积分复盘(高等数学本质上是对趋势的动态描述,是对各种相关性抽象的表述。)

文章目录 引言I 复盘1.1 概念和表述1.2 现实与虚构1.3 有穷和无穷1.4 静态和动态1.5 直觉和逻辑II 通过数学逻辑,理解人生。2.1 精明与聪明2.2 朋友和理性的对手2.3 攒钱和赚钱2.4 荣誉和财富引言 高等数学本质上是对趋势的动态描述,是对各种相关性抽象的表述。 I 复盘 1.…...

JAVA线程池原理详解一

JAVA线程池原理详解一 一. 线程池的优点 线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用。可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。 二…...

Windows平台Unity Camera场景实现轻量级RTSP服务和RTMP推送

技术背景随着VR技术在医疗、军事、农业、学校、景区、消防、公共安全、研学机构、展厅展馆,商场等场所普及,开发者对Unity平台下的直播体验提出了更高的要求。技术实现Unity平台下的RTMP推流、RTMP、RTSP播放前几年已经覆盖了Windows、Linux、Android、i…...

LSB 题解

今天来刷一道Misc的题目,LSB原理进行图片隐写 LSB原理 LSB是一种利用人类视觉的局限性设计的幻术 PNG和BMP图片中的图像像素一般是由RGB(RED红 GREEN绿 BLUE蓝)三原色组成 记住,JPG图片是不适合使用LSB隐写的,JPG图片对像数进行了有损压缩…...

离线部署docker与镜像

离线部署docker与镜像 1.离线部署docker 1).在docker官网上下载,合适的安装文件 本次使用的是“docker-20.10.9.tgz ” 下载地址:https://download.docker.com/linux/static/stable/x86_64/ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下…...

Linux文件系统介绍(上)

使用 Linux 系统时,需要作出的决策之一就是为存储设备选用什么文件系统。大多数 Linux 发行版在安装时会非常贴心地提供默认的文件系统,大多数入门级用户想都不想就用了默认的那个。 使用默认文件系统未必就不好,但了解一下可用的选择有时也会…...

创建SpringBoot注意事项

作为一个java小白,你是否因为创建SpringBoot项目那些莫名其妙的错误搞得头皮发麻。不要慌张,这篇文章能帮你解决90%的问题【持续更新…】 本文结合创建SpringBoot项目的完整过程来讲 在idea中新建项目 虽然SpringBoot项目是由maven内核组成的&#xff0…...

centos 7 部署awstats 网站访问检测

一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...

【2025年】解决Burpsuite抓不到https包的问题

环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"&#xff0…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中,如何展示好看的实验结果图像非常重要!!! 1、灰度原始图像 灰度图像每个像素点只有一个数值,代表该点的​​亮度(或…...