实时音视频通信的主要矛盾及解决方法
实时音视频通信的主要矛盾及解决方法
- 实时音视频通信的主要矛盾及解决方法
- 实时音视频通信的主要矛盾
- 矛盾的解决方法
- 增加带宽
- 减少数据量
- 适当增加延时
- 提高网络质量
- 快速准确地评估带宽
- 总结
- 参考
实时音视频通信的主要矛盾及解决方法
实时音视频通信的主要矛盾
实时音视频通信的主要矛盾就在于音视频服务质量与带宽大小、网络质量、实时性之间的矛盾。
矛盾的解决方法
增加带宽
增加带宽是最有效解决问题的根本。只要用户带宽足够,一切的问题可能就不是问题了。
可现实中我们很少能希望用户去提升带宽,且在多用户实时通信场景下,单个用户对带宽的提升对整体服务而言影响也不大,因为在这种场景下通信服务质量的好坏是由网络最差的那个用户决定的。所以这里增加带宽是指所有用户的带宽都增加。
增加带宽的具体方法:
- 首先,可以期待的是5G网络的普及。这会整体的提升所有接入5G网络设备的用户的网络能力。
- 然后,在客户端方面,WebRTC支持的选路方案是一个很好的方案,它可以按优先级选择最优质的网络连接线路。
- 最后,在服务端方面,可以通过提供更优质的接入服务、保证云端网络的带宽和质量、更合理的路由调度策略来提供更优秀的带宽。
1是被动方法,2和3是主动方法。
减少数据量
当网络带宽无法增加时,最有效的解决这一矛盾的方法就是减少音视频的数据量,虽然会牺牲音视频服务的质量。
通常有5种方法来减少数据量,分别是:
- 采用更好的压缩算法:比如使用H265,AV1等压缩率更高的编解码器。
- 使用SVC技术:SVC技术就是将视频按时间、空间及质量分成多层编码,然后将它们装在一路流中发给服务端。服务端收到后,再根据每个用户的带宽情况选择不同的层下发。
- 使用Simulcast技术:与SVC的分层思想类似,但它的实现更简单。就是将视频编码出不同分辨率的多路码流,上传给服务器。服务器则根据每个用户带宽情况选择一路最合适的流下发。
- 使用动态码率:当网络带宽评估用户带宽不足时,则通过编译器让其减小输出码率;而当评估带宽增大时,则增加输出码率。
- 甩帧或减少业务:这是一种下下策的方法,只有在用户网络非常差的情况下才可能使用。
上述方法中,使用最多的是Simulcast技术和动态码率。
适当增加延时
在网络抖动的情况下,使用缓冲队列来平滑处理数据,这种适当增加延时的方法也是可以解决部分业务质量和网络之间的矛盾的。
对于实时音视频直播而言,必须把时延控制在一定范围内。由于音视频的采集、编解码、渲染等时间是固定的,所以只要把网络时延算出来,就可以确定缓冲区的时延。
这种方式在WebRTC中也是有应用的,比如PacedSender。
提高网络质量
提高网络质量的前提是网络没有发生拥塞。可以从丢包、延迟、抖动三个方面来评价网络质量的好坏。
- 丢包:是网络传输过程中对网络影响最大的指标,优质的网络丢包率不超过2%。对于WebRTC而言,大于2%且小于10%的丢包率是正常网络。
- 延迟:相对丢包来说对网络影响要小点。如果网络中延迟持续增大,则可能是网络中发生了拥塞。
- 抖动:对网络影响最小。一般的抖动都可以通过缓冲队列来解决。
在WebRTC中有很多提高网络质量的方法,比如NACK/RTX、FEC前向纠错、JitterBuffer防抖动、NetEQ等。
- NACK/RTX:NACK是RTCP的一种消息类型,由接收端向发送端报告一段时间内有哪些包丢失了;RTX指发送端重传丢失的包,并使用新的SSRC(将音视频包与重传包进行区分)。
- FEC前向纠错:使用异或操作传输数据,以便丢包时恢复丢失的包。FEC特别适合随机少量丢包的场景。
- JitterBuffer:用于防抖动,可以将抖动较小的乱序包恢复有序。
- NetEQ:包括JitterBuffer,专用于音频控制,可以实现音频的防抖动。
- 拥塞控制:它需要控制两个点:第一个点是Pacer,降低发送码率。当然仅降低发送码率还不够,因为如果编码器仍然输出大量码流给Pacer,那么Pacer 的缓冲区迟早会被撑爆。所以在控制Pacer让它减少发送码率的同时,一定要降低音视频的编码器的输出码率,从而保持平衡,进而使数据平缓下行。
快速准确地评估带宽
网络质量提升的前提是网络没有拥塞。
只要能够快速准确地评估出带宽,通常就能有效的防止网络拥塞的发生。
在实时通信领域,有4种常见的带宽评估方法:
- Goog-REMB
- Goog-TCC
- NADA
- SCReAM
目前在WebRTC中Google最新的Transport-CC算法(Goog-TCC)是表现最优秀的。
总结
总结一下,对于服务质量保障,首先提高网络质量,NACK和FEC解决丢包问题,JitterBuffer解决视频的乱序与抖动,NetEQ解决音频的乱序与抖动;带宽评估通过Goog-REMB和Goog-TCC,还有丢包的带宽评估;为了保障实时性,需要选择更优质的线路,比如客户端与服务端通信的时候选择更好的路线节点,保证云端网络带宽等等;从业务上,减少数据量可以用AV1、SVC、Simulcast、动态码率,减少业务;在防拥塞上,通过Pacer进行流控,只要能控制在500ms之内,适当增加时延也是可以接收的。
参考
- https://zhuanlan.zhihu.com/p/575264502
- https://avdancedu.com/2763ac60/
相关文章:

实时音视频通信的主要矛盾及解决方法
实时音视频通信的主要矛盾及解决方法 实时音视频通信的主要矛盾及解决方法实时音视频通信的主要矛盾矛盾的解决方法增加带宽减少数据量适当增加延时提高网络质量快速准确地评估带宽 总结参考 实时音视频通信的主要矛盾及解决方法 实时音视频通信的主要矛盾 实时音视频通信的主…...
【Delphi 爬虫库 4】使用封装好的 XML 解析库对 XML 数据进行解析
由于官方提供的TXMLDocument组件并不是特别好用,有着体积大,速度慢,调用不方便等缺点。 这里直接利用封装好的XML 解析库来对Xml数据进行解析与生成。 文章目录 1、生成XML文件2、解析XML文件3、生成带注释的XML文件4、删除XML文件节点 1、生…...

Flask简介
Flask简介 安装概述使用PyCharm创建一个Flask程序 Flask程序的基本结构初始化路由和视图函数启动服务器请求-响应循环 安装 概述 Flask算是小型框架,小到可以称为“微框架”。Flask 非常小,因此你一旦能够熟练使用它,很可能就能读懂它所有的…...

神经网络中的归一化
我们今天介绍一下神经网络中的归一化方法~ 之前学到的机器学习中的归一化是将数据缩放到特定范围内,以消除不同特征之间的量纲和取值范围差异。通过将原始数据缩放到一个特定的范围内,比如[0,1]或者[-1,1],来消除不同特征之间的量纲和取值范围…...

《从Paxos到Zookeeper》——第四、七章:基本概念及原理
目录 第四章 Zookeeper与Paxos 4.1 Zk是什么 4.1.1 Zk特性 4.1.2 Zk基本概念 4.1.2.1 集群角色(Follower, Leader, Observer) 4.1.2.2 数据模型 4.1.2.3 ZNode(数据节点) 4.1.2.4 Session(会话) 4.1.2.5 ACL(Access Control Lists) 4.1.2.6 Watcher(事件…...

网络演进技术演进:裸纤专线、SDH、MSTP+、OTN、PTN、IP-RAN
前言 文章主要介绍常见名词以及其在各自领域实现的功能价值。 01 裸纤 裸光纤(裸光纤)由运营商提供,是无中继的光纤线路,仅通过配线架连接。相比传统光纤,裸光纤提供纯粹的物理传输路径,无需额外网…...
MMC设备
MMC(MultiMediaCard)是一种闪存卡标准,用于作为便携式设备上的存储媒介,例如数码相机、智能手机、平板电脑、个人数字助理(PDA)以及其他便携式设备。MMC卡最初是由SanDisk和Siemens AG开发的,并…...

图片浏览器-PicView
一、前言 PicView 是一款适用于 Windows 10 或 11 的快速高效的图像查看器,配备了干净简洁的用户界面,可以在不需要时方便地隐藏。 二、支持类型 它支持广泛的图像文件类型,包括:WEBP、GIF、SVG、PNG、JXL、HEIC、PSD 三、软件特…...
一些零碎小知识
函数递归复习 #define 的头文件包含 #define定义标识符常量 等define其他用法 斐波那契数列 函数栈帧 青蛙跳台问题 汉诺塔问题 字符“0”与0的计算 “0”-“0”0; 最后一次作业题一道 素数 随机数 strand timer rand 水仙花数 变种随鲜花 斐波那契数…...

2.2 Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3-基础-Vue基本语法
文本渲染指令 文本渲染指令-v-html与v-text Vue使用了基于HTML的模板语法,允许开发者声明式地将DOM绑定至底层Vue实例的数据。所有Vue的模板都是 合法的HTML,所以能被遵循规范的浏览器和HTML解析器解析。 在前面,我们一直使用的是字符串插…...

(Arxiv,2024)Mind the Modality Gap:通过跨模态对齐建立遥感视觉语言模型
文章目录 相关资料摘要引言相关工作对比语言图像预训练遥感域专用 CLIP 模型遥感中的多模态 CLIP 启发模型 方法模型算法输入阶段:输出阶段:步骤说明: 第一阶段:通过权重插值修补CLIP将遥感图像模态与自然图像和文本对齐 实验 相关…...
区块链 | 一文了解 NFT 的生态系统(上)
🐶原文: Understanding Security Issues in the NFT Ecosystem 🐶写在前面: 本博客只摘取了原论文的第二、三节。 技术背景知识 在本节中,我们将介绍以太坊生态系统的构建模块,重点关注「NFT,…...
为什么centos官方版不支持arm架构?
为什么centos官方版不支持arm架构? 1、资源限制:CentOS是由社区维护的开源操作系统,其开发和维护需要大量的人力和物力资源。由于ARM架构的设备相对较少,社区资源有限,因此官方版CentOS选择集中精力在x86架构上进行开发…...
awk小尝试2(随手记)
文章目录 需求1解法 需求2解法(3种-grep/sed/awk) 需求1 使用hostname -I创建文件名 echo hostname -I.txt 10.0.0.124 .txt # 需要注意,这里的.txt前有一个空格,需要去掉,不然就是两个文件名解法 echo hostname -I…...

Vue的项目启动指令分析
通过Vue CLI脚手架创建的项目,默认的启动项目方式是 npm run serve 这里的serve是可以修改的。 在创建的项目目录中,找到package.json 双击打开,找到scripts部分 在scripts部分,有一个"serve"键值对,这里的…...

年轻人刮疯了,刮刮乐断货了
年轻人刮疯了 刮刮乐缺货了。 00后彩票店老板陆诗等得有点着急。她的福彩店开在深圳,今年4月才开门营业,但从开业到今天,刮刮乐总共就来了一回货——开业时发的20本。 那之后,刮刮乐就彻底断供了。原本,陆诗想把刮刮…...

25 JavaScript学习:var let const
JavaScript全局变量 JavaScript中全局变量存在多种情况和定义方式,下面详细解释并提供相应的举例: 使用var关键字声明的全局变量: var globalVar "我是全局变量";未使用var关键字声明的变量会成为全局变量(不推荐使用&…...

docker部署的nacos2.2x开启鉴权功能
注意在2.2.0版本之后如果不开启鉴权,那么默认不需要登录就可以访问 所以我们需要手动开启鉴权,nacos启动好以后来到容器内部修改 docker exec -it nacos /bin/shvim conf/application.properties在第34行下面添加 nacos.core.auth.enabledtrue nacos.cor…...

【数据结构与算法】之五道链表进阶面试题详解!
目录 1、链表的回文结构 2、相交链表 3、随机链表的复制 4、环形链表 5、环形链表(||) 6、完结散花 个人主页:秋风起,再归来~ 数据结构与算法 个人格言:悟已往之不谏,知…...

vue2实现生成二维码和复制保存图片功能(复制的同时会给图片加文字)
<template><divstyle"display: flex;justify-content: center;align-items: center;width: 100vw;height: 100vh;"><div><!-- 生成二维码按钮和输入二维码的输入框 --><input v-model"url" placeholder"输入链接" ty…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...