实时音视频通信的主要矛盾及解决方法
实时音视频通信的主要矛盾及解决方法
- 实时音视频通信的主要矛盾及解决方法
- 实时音视频通信的主要矛盾
- 矛盾的解决方法
- 增加带宽
- 减少数据量
- 适当增加延时
- 提高网络质量
- 快速准确地评估带宽
- 总结
- 参考
实时音视频通信的主要矛盾及解决方法
实时音视频通信的主要矛盾
实时音视频通信的主要矛盾就在于音视频服务质量与带宽大小、网络质量、实时性之间的矛盾。
矛盾的解决方法
增加带宽
增加带宽是最有效解决问题的根本。只要用户带宽足够,一切的问题可能就不是问题了。
可现实中我们很少能希望用户去提升带宽,且在多用户实时通信场景下,单个用户对带宽的提升对整体服务而言影响也不大,因为在这种场景下通信服务质量的好坏是由网络最差的那个用户决定的。所以这里增加带宽是指所有用户的带宽都增加。
增加带宽的具体方法:
- 首先,可以期待的是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…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...