WebRTC | 音视频实时通信的本质

news2024/11/24 12:25:08

目录

一、音视频实时通信的两种指标

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是最优的。

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

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

相关文章

HBase API

我们之后的实际开发中不可能在服务器那边直接使用shell命令一直敲的&#xff0c;一般都是通过API进行操作的。 环境准备 新建Maven项目&#xff0c;导入Maven依赖 <dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>…

计算机网络性能指标

比特&#xff1a;数据量的单位 KB 2^10B 2^13 bit 比特率&#xff1a;连接在计算机网络上的主机在数字通道上传送比特的速率 kb/s 10^3b/s 带宽&#xff1a;信号所包含的各种频率不同的成分所占据的频率范围 Hz 表示在网络中的通信线路所能传送数据的能力&#xff08…

CentOS虚拟机更改屏幕锁屏时间

&#xff08;1&#xff09;点击“应用程序”&#xff0c;再点击“系统工具”&#xff0c;再点击“设置” &#xff08;2&#xff09; &#xff08;3&#xff09;在“设置”中点击“Privacy”&#xff0c;点击“锁屏”

【博客691】VictoriaMetrics如何支持Multi Retention

VictoriaMetrics如何支持Multi Retention 场景&#xff1a; 实现Multi Retention Setup within VictoriaMetrics Cluster&#xff0c;使得为不同的监控数据采用不同的保存时间 Multi Retention实现方式 方式&#xff1a; VictoriaMetrics 的社区版本通过 -retentionPeriod 命…

系统学习Linux-Redis基础

一、redis概述 NoSQL&#xff08;非关系型数据库、内存存储&#xff09; 类型 文档型数据库&#xff08;Document-oriented database&#xff09;如MongoDB&#xff1b; 列族数据库&#xff08;Column-family database&#xff09;如HBase、Cassandra等&#xff1b; 图形数…

如何将视频转成gif图?视频怎么转gif高清图片?

在看电视或是短视频的时候&#xff0c;总能发现一些有趣的片段&#xff0c;当想把这些视频转gif图片发送给朋友的时候该怎么处理呢&#xff1f;其实可以试试专业的视频转gif工具&#xff0c;本文介绍一个视频在线转gif的方法&#xff0c;一起来了解一下吧。 打开首页&#xff…

Profibus DP主站转Modbus TCP网关profibus主站模拟软件

捷米JM-DPM-TCP网关。这款产品在Profibus总线侧实现了主站功能&#xff0c;在以太网侧实现了ModbusTcp服务器功能&#xff0c;为我们的工业自动化网络带来了全新的可能。 捷米JM-DPM-TCP网关是如何实现这些功能的呢&#xff1f;首先&#xff0c;让我们来看看它的Profibus总线侧…

IPC之三:使用 System V 消息队列进行进程间通信的实例

IPC 是 Linux 编程中一个重要的概念&#xff0c;IPC 有多种方式&#xff0c;本文主要介绍消息队列(Message Queues)&#xff0c;消息队列可以完成同一台计算机上的进程之间的通信&#xff0c;相比较管道&#xff0c;消息队列要复杂一些&#xff0c;但使用起来更加灵活和方便&am…

C++的auto究竟是何方神圣

C的auto究竟是何方神圣 前言&#x1f64c;auto&#xff08;C 11&#xff09; 的使用细则auto是什么&#xff1f; auto声明的变量是在什么时期被编译器推导出来呢&#xff1f;为什么使用auto进行定义变量时&#xff0c;必须进行初始化&#xff1f; auto 的使用场景auto与指针和引…

gitee分支合并

合并dev分支到master&#xff08;合并到主分支&#xff09; git checkout master git merge dev //这里的dev表示你的分支名称 git push //推送到远程仓库 效果如下图 不报错就表示推送成功了&#xff0c;希望能帮助各位小伙伴

Flamingo

基于已有的图像模型和文本模型构建多模态模型。输入是图像、视频和文本&#xff0c;输出是文本。 Vision encoder来自预训练的NormalizerFree ResNet (NFNet)&#xff0c;之后经过图文对比损失学习。图片经过图像模型的输出是2D grid&#xff0c;视频按1FPS的频率采样后经过图…

python优雅地爬虫

申明&#xff1a;仅用作学习用途&#xff0c;不提供任何的商业价值。 背景 我需要获得新闻&#xff0c;然后tts&#xff0c;在每天上班的路上可以听一下。具体的方案后期我也会做一次分享。先看我喜欢的万能的老路&#xff1a;获得html内容-> python的工具库解析&#xff0…

Running Homebrew as root is extremely dangerous and no longer supported

Running Homebrew as root is extremely dangerous and no longer supported 查看磁盘所有信息 在使用homebrew安装smartmontools&#xff0c;查看Mac磁盘信息&#xff0c;包括mac磁盘写入量、mac磁盘健康、磁盘启动次数等&#xff0c;遇到的问题及解决方案 使用brew install s…

单片机开发 esp8266

一、固件界面 二、项目介绍 固件名称&#xff1a;esp8266-universalboard v1.0 提供商&#xff1a; 半条虫(466814195) 下载&#xff1a;esp8266-universalboard.bin 源码地址&#xff1a;Gitlab

STM32 F103C8T6学习笔记1:开发环境与原理图的熟悉

作为一名大学生&#xff0c;学习单片机有一段时间了&#xff0c;也接触过嵌入式ARM的开发&#xff0c;但从未使用以及接触过STM32C8T6大开发使用&#xff0c;于是从今日开始&#xff0c;将学习使用它~ 本文介绍STM32C8T6最小系统开发环境搭建注意问题&#xff0c;STM32C8T6单片…

TCP的四次挥手与TCP状态转换

文章目录 四次挥手场景步骤TCP状态转换 四次挥手场景 TCP客户端与服务器断开连接的时候&#xff0c;在程序中使用close()函数&#xff0c;会使用TCP协议四次挥手。 客户端和服务端都可以主动发起。 因TCP连接时候是双向的&#xff0c;所以断开的时候也是双向的。 步骤 三次…

dueling network原理和实现

算法原理&#xff1a; Q ( s , a ; θ , α , β ) V ( s ; θ , β ) ( A ( s , a ; θ , α ) − max ⁡ a ′ ∈ ∣ A ∣ A ( s , a ′ ; θ , α ) ) . \begin{gathered}Q(s,a;\theta,\alpha,\beta)V(s;\theta,\beta)\left(A(s,a;\theta,\alpha)-\max_{a\in|\mathcal{A}…

网络编程(JavaEE初阶系列10)

目录 前言&#xff1a; 1.网络编程的基础 1.1为什么需要网络编程 1.2什么是网络编程 1.3网络编程中的基本概念 1.3.1发送端和接收端 1.3.2请求和响应 1.3.3客户端和服务端 2.Socket套接字 2.1概念 2.2分类 3.UDP数据报套接字编程 3.1DataGramSocket API 3.2Datagr…

【刷题笔记8.8】LeetCode题目:两数之和

LeetCode&#xff08;Hot100&#xff09;&#xff1a;两个数之和 题目描述及示例&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会…

《合成孔径雷达成像算法与实现》Figure3.3

代码复现如下&#xff1a; clc clear all close all%参数设置 TBP [25,50,100,200,400]; %时间带宽积 T 1e-6; %脉冲持续时间H figure; for i 1:5% 参数计算B TBP(i)/T; % 信号带宽K B/T; % 线性调频频率alp…