WebRTC | 音视频实时通信的本质
目录
一、音视频实时通信的两种指标
1. 实时通信延迟指标
2. 视频相关的基本概念
3. 音视频服务质量指标
二、解决实时通信的主要矛盾
1. 增加带宽
A. 提供更优质的接入服务
B. 保证云端网络的带宽和质量
C. 更合理的路由调度策略
2. 减少数据量
A. 采用更好的压缩算法
B. SVC技术
C. Simulcast技术
D. 动态码率
E. 甩帧或减少业务
3. 适当增加时延
4. 提高网络质量
5. 快速准确地评估带宽
音视频实时通信追求的本质是尽可能逼近或达到面对面交流的效果,同时这也是音视频实时通信的目标。
一、音视频实时通信的两种指标
一是实时通信中的延迟指标;二是音视频服务质量指标。
1. 实时通信延迟指标
在端到端之间,引起延迟的因素有很多,比如音视频采集时间、编解码时间、网络传输时间、音视频的渲染时间以及各种缓冲区所用的时间等。在众多延迟因素中,网络传输引起的延迟是动态的(时快时慢,飘忽不定),所以其最难以评估、难以控制且难以解决,而其他因素引起的延迟时间则基本是恒定不变的。
2. 视频相关的基本概念
(1)分辨率:指图像占用屏幕上像素的多少。图像中的像素密度越高,图像的分辨率越高。对于实时通信而言,图像默认分辨率一般设置为640×480或640×360,如果分辨率低于该值,则图像中包含的信息太少,基本只能看到一个头像,效果就会很差。另外,分辨率还指明了图像清晰度的最大上限。
(2)帧率:指视频每秒播放帧(图像)的数量。播放的帧数越多,视频越流畅。一般动画片/电影的帧率在24帧/秒以上,高清视频的帧率在60帧/秒以上。对于实时通信的视频来说,15帧/秒是一个分水岭,当帧率小于15帧/秒时,大部分人会觉得视频质量不佳,卡顿严重。
(3)码率:指视频压缩后,每秒数据流的大小。原则上,分辨率越大,码率也越大。如果出现分辨率大而码率小的情况,说明在视频编码时丢弃了大量的图像信息,这将导致解码时无法将图像完整复原,从而造成失真。
在相同分辨率的情况下,码率越大还原度越好,图像越清晰。当然,这里的码率大小是有限制的,超过一定阈值(MOS=5)后,再大的码率也没有意义了。
(4)MOS值:用来评估业务服务质量好坏的,MOS值越高,业务质量越好。它共分为5级,由高到低分别为:5——优秀;4——较好;3——还可以;2——差;1——很坏。
3. 音视频服务质量指标
业务服务质量指标,包括音频服务质量和视频服务质量。
要想使在线实时通信可以逼近或达到面对面交流的效果,就必须尽可能地降低传输的延迟,同时增大音视频传输的码率。然而,降低延迟与增大码率是矛盾的,除非所有用户都有足够的带宽和足够好的网络质量,但这显然是不现实的。
二、解决实时通信的主要矛盾
实时通信的主要矛盾是音视频服务质量与带宽大小、网络质量、实时性之间的矛盾。以下几种方法可解决这一矛盾:
- 一是增加带宽;
- 二是减少数据量;
- 三是适当增加时延;
- 四是提高网络质量;
- 五是快速准确地评估带宽。
1. 增加带宽
除了等待5G提升网络能力这种被动的方法外,还有一些变相增加带宽的方案,分为客户端方案和服务端方案。
在客户端方案中,最典型的就是WebRTC支持的选路方案——它可以按优先级选择最优质的网络连接线路。
在服务端方案中,有三种可以间接提升带宽的方法,分别是:提供更优质的接入服务,保证云端网络的带宽和质量,更合理的路由调度策略。
A. 提供更优质的接入服务
一般情况下,同类型运营商(如联通)的用户相互通信时,都不会遇到什么问题,但跨运营商(如联通与电信)的用户进行通信时,网络质量就很难得到有效保障。解决这一问题的一般办法是,让用户连接同一地区、同一运营商的接入服务器,这样就可以有效保障用户与服务器之间的连接通道。如上海的电信用户在接入时,一定要选择一台位于上海的、电信的、负载最低的服务器接入。
B. 保证云端网络的带宽和质量
即数据进入云端后,云内部的网络质量一定要好。因为云内部的带宽大小和质量是可以控制的,所以提升这部分的网络能力相对简单一些。最简单的办法是,可以购买优质的BGP网络作为云内部使用。但优质的BGP的费用也是比较高的。
C. 更合理的路由调度策略
选路的基本原则是距离最近、网络质量最好、服务器负载最小的线路是最优质的线路。
2. 减少数据量
减少音视频数据量一定是以牺牲音视频服务质量为代价的,但这就是一种平衡。
通过减少数据量来保障音视频的实时性有哪些方法呢?这里总结了5种方法,分别是采用更好的压缩算法、SVC技术、Simulcast技术、动态码率、甩帧或减少业务。(用得最多的是Simulcast和动态码率)
A. 采用更好的压缩算法
H265、AVI是最近几年才推出的编解码器,它的压缩率要比现在流行的H264高得多。
B. SVC技术
其基本原理是将视频按时间、空间及质量分成多层编码,然后将它们装在一路流中发给服务端。服务端收到后,再根据每个用户的带宽情况选择不同的层下发。其好处是,可以让不同网络状况的用户都得到较好的服务质量。但它也有缺点:一是上行码流不但没减少反而增加了,所以需要上行用户配置很好的带宽;二是由于SVC实现复杂,又没有硬件支持,所以终端解码时对CPU消耗很大。
C. Simulcast技术
Simulcast与SVC技术类似,不过它的实现要比SVC简单得多。其基本原理是,将视频编码出多种不同分辨率的多路码流,然后上传给服务端。服务端收到码流后,根据每个用户不同的带宽情况,选择其中一路最合适的码流下发给用户。它与SVC技术相比有以下几点不同:
- 一是Simulcast上传的每一路流可以单独解码,而SVC做不到;
- 二是由于Simulcast的每一路都可以单独解码,所以它的解码复杂度与普通解码的是一样的;
- 三是由于Simulcast上传的是多路单独的流,所以上传码率要比SVC多很多。
D. 动态码率
当网络带宽评估出用户带宽不够时,会通过编译器让其减小输出码率;当评估出带宽增大时,又会增加输出码率。这就是动态码率。如果你发现在网络抖动比较大时,某个音视频产品的图像一会儿清晰,一会儿模糊,那多半是因为其采用了动态码率的策略。
E. 甩帧或减少业务
除了上面介绍的那些方法外,还有一种不太友好的方法,就是甩帧或关闭某些不重要的业务来减少数据量。当然,这种方法是在用户带宽严重不足的情况下才使用的,只有到了万不得已的时候才会使用这种策略。
3. 适当增加时延
我们将数据传输时出现的时快时慢现象称为网络抖动。对于视频来说,网络抖动会造成频繁卡顿和快播现象;对于音频而言,则会出现断音、吞音等问题。如何解决这一问题呢?方法其实很简单:增加时延,即先将数据放到队列中缓冲一下,然后再从队列中获取数据进行处理,这样数据就变得“平滑”了。
不过对于实时音视频直播而言,必须把延时控制在一定范围之内。只要让单向延迟小于500ms,大部分人都是可以接受的。由于音视频的采集、编解码、渲染等时间是固定的,所以只要将网络时延计算出来,就可以确定缓冲区的时延了。
4. 提高网络质量
提高网络质量是有默认前提条件的,即网络没有发生拥塞时才能提高网络质量,否则提高网络质量无从谈起。
在网络上,丢包、延迟、抖动会对网络质量产生影响:
- 丢包,是网络传输过程中网络质量好坏的最重要标志,对网络的影响是最大的。优质的网络丢包率不超过2%。对于WebRTC而言,大于2%且小于10%的丢包率是正常的网络。
- 延迟,也是网络质量的重要指标,但与丢包相比,其对网络的影响要少一些。如果在两端之间数据传输的延迟持续增大,说明网络线路很可能发生了拥塞。
- 抖动,对网络质量的影响是最小的。一般情况下,网络都会发生一些抖动,如果抖动很小的话,可以通过循环队列将其消除;如果抖动过大,则将乱序包当作丢包处理。在WebRTC中,抖动时长不能超过10ms,也就是说,如果有包乱序了,最多等待该乱序包10ms,超过10ms就认为该包丢了(即使在第11ms时,乱序的包来了,也仍然认为它丢失了)。
解决丢包、延迟、抖动问题的5种方法:NACK/RTX、FEC前向纠错、JitterBufer防抖动、NetEQ、拥塞控制。
- NACK/RTX,NACK是RTCP中的一种消息类型,由接收端向发送端报告一段时间内有哪些包丢失了。RTX是指发送端重传丢失包,并使用新的SSRC(将传输的音视频包与重传包进行区分)。
- FEC前向纠错,使用异或操作传输数据,以便在丢包时可以通过这种机制恢复丢失的包。FEC特别适合随机少量丢包的场景。
- JitterBufer,用于防抖动,可以将抖动较小的乱序包恢复成有序包。
- NetEQ,专用于音频控制,里面包括了JitterBufer。除此之外,它还可以利用音频的变速不变调机制将积攒的音频数据快速播放或将不足的音频拉长播放,以实现音频的防抖动。
- 拥塞控制:见后文。
5. 快速准确地评估带宽
在实时通信领域,有四种常见的带宽评估方法,分别是Goog-REMB、Goog-TCC、NADA、SCReAM。它们对网络带宽的评估各有优劣,但整体上来看Google最新的带宽评估算法Goog-TCC是最优的。
相关文章:

WebRTC | 音视频实时通信的本质
目录 一、音视频实时通信的两种指标 1. 实时通信延迟指标 2. 视频相关的基本概念 3. 音视频服务质量指标 二、解决实时通信的主要矛盾 1. 增加带宽 A. 提供更优质的接入服务 B. 保证云端网络的带宽和质量 C. 更合理的路由调度策略 2. 减少数据量 A. 采用更好的压缩算…...

ApiPost的使用
1. 设计接口 请求参数的介绍 Query:相当于get请求,写的参数在地址栏中可以看到 Body: 相当于 post请求,请求参数不在地址栏中显示。 请求表单类型,用form-data json文件类型,用row 2. 预期响应期望 设置完每一项点一下生成响应…...

6、CCS 配置工程头文件批量添加路径的方法
1、进入到图示的框框里 2、编辑好需要添加的路径,并按ctrl c 3、选中include paths(-I)框框里的最后一条路径 4、然后ctrl v,这样路径就复制到预定义路径里了...

Visual Studio配置PCL库
Visual Studio配置PCL库 Debug和Release配置新建项目配置属性表测试参考 Debug和Release Debug和Release的配置过程一模一样,唯一区别就在于最后一步插入的附加依赖项不同,因此下面以debug为例。 配置新建项目 1、新建一个C空项目,模式设置…...

数据分析 | 为什么Bagging算法的效果优于单个评估器
1. 回归问题如何降低方差 以随机森林为例,假设随机森林中含有n个弱评估器,由于子样本集的相似性以及使用的是同种模型,因此各模型有近似相等的方差和偏差,因此假设任意弱评估器上输出结果为,方差均为,则随机森林的输出…...

mysql架构介绍
1.整体架构图 我们发现整体的体系是由连接层、服务层、引擎层和物理文件存储层组成。 1.连接层 连接层是处理客户端和服务端之间的通信的,比如一些连接处理、授权验证等等。 2.服务层 服务层主要完成核心的功能,如SQL接口,就是用来接收…...

EIK+Filebeat+Kafka
目录 一、Kafka 概述 1)为什么需要消息队列(MQ) 2)使用消息队列的好处 (1)解耦 (2)可恢复性 (3)缓冲 (4)灵活性 & 峰值处理…...

python安装xgboost报错
ERROR: Could not find a version that satisfies the requirement xgboost (from versions: none) ERROR: No matching distribution found for xgboost 解决办法: 换成国内的pip源 pip install xgboost -i http://pypi.doubanio.com/simple/ --trusted-host py …...

语音芯片的型号有哪些?为什么强烈推荐使用flash型可擦写的
一、语音芯片的简介 语音芯片的型号有哪些?为什么强烈推荐使用flash型可擦写的芯片。这里我们简单描述一下如下常见类容: 1、他们都有什么特点?以及发展的历程简介 2、常见的语音芯片有哪些? 3、为什么推荐使用flash型可以重复…...

【OpenCV常用函数:轮廓检测+外接矩形检测】cv2.findContours()+cv2.boundingRect()
文章目录 1、cv2.findContours()2、cv2.boundingRect() 1、cv2.findContours() 对具有黑色背景的二值图像寻找白色区域的轮廓,因此一般都会先经过cvtColor()灰度化和threshold()二值化后的图像作为输入。 cv2.findContous(image, mode, method[, contours[, hiera…...
opencv,opengl,osg,vulkan,webgL,opencL,cuda
OpenCV OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C 类构成,同时提供了Python、Ruby、MATLAB等…...

golang拥有wireshark数据包解析能力
golang拥有wireshark数据包解析能力 1. 功能和实现 wireshark拥有世界上最全面的协议解析能力并且还在不断更新中,通过调研,没有办法找到与wireshark同水平的解析工具。 为了使得golang语言可以拥有wireshark一样强大的协议解析能力,库 gowir…...

Redis_分片集群
10. 分片集群 10.1简介 业务场景,需要存储50G的数据。对于内存和硬盘配置不足,选用两种方式 一种:纵向扩展:加内存,加硬盘,提高CPU。简单、直接。RDB存储效率要考虑。成本要考虑。二种:横向扩…...
测试提升方向:你选测试开发?还是性能测试?
如果想要在测试领域好好发展,提升自己的测试技术是必不可少的,但是,选对方向更为重要,功能测试、自动化测试、测试开发、性能测试、安全测试、测试管理,每个测试方向都不简单,但是,大环境就是&a…...

无涯教程-Perl - print函数
描述 此函数将LIST中的表达式的值打印到当前的默认输出文件句柄或FILEHANDLE指定的句柄中。 如果设置,则$\变量将添加到LIST的末尾。 如果LIST为空,则打印$_中的值。 print接受一个值列表,列表中的每个元素都将被解释为一个表达式。 语法 以下是此函数的简单语法- print…...
python搜索文件夹内类似的文件名
# codingutf8 __author__ Administrator import os """ #编写函数,计算字符串匹配的准确率 def Rate(origin,userInput): if not (isinstance(origin,str) and isinstance(userInput,str)): print(The two parameters must be strings…...

[保研/考研机试] KY3 约数的个数 清华大学复试上机题 C++实现
题目链接: KY3 约数的个数 https://www.nowcoder.com/share/jump/437195121691716950188 描述 输入n个整数,依次输出每个数的约数的个数 输入描述: 输入的第一行为N,即数组的个数(N<1000) 接下来的1行包括N个整数,其中每个…...
cmake扩展(2)——windows下动态设置输出文件(dll/exe)版本
准备 windows下设置文件的版本需要通过VERSIONINFO接口,详情参考VERSIONINFO resource。这里我们根据模板做了一定的修改。 1 VERSIONINFOFILEVERSION ${GIT_VERSION} //文件版本号,必填。以,分隔,输出以.分隔。这里是取CMakeLists里的GIT_…...

Python-OpenCV中的图像处理-颜色空间转换
Python-OpenCV中的图像处理-颜色空间转换 颜色空间转换获取HSV的值 颜色空间转换 在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会 发现我们经常用到的也就两种: BGR G r a y 和 B G R Gray 和 BGR Gray和BGRHSV。 注意:在 OpenCV 的…...

yolov5目标检测多线程Qt界面
上一篇文章:yolov5目标检测多线程C部署 V1 基本功能实现 mainwindow.h #pragma once#include <iostream>#include <QMainWindow> #include <QFileDialog> #include <QThread>#include <opencv2/opencv.hpp>#include "yolov5.…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...