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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Metasploitable2靶机漏洞复现

一、信息收集 nmap扫描靶机信息 二、弱口令 1.系统弱口令 在Kali Linux中使用telnet远程连接靶机 输入账号密码msfadmin即可登录 2.MySQL弱口令 使用mysql -h 靶机IP地址即可连接 3.PostgreSQL弱密码登录 输入psql -h 192.168.110.134 -U postgres 密码为postgres 输入\…

10. Docker Swarm(一)

目录 1、前言 2、Docker Swarm体系架构 2.1、简单介绍 2.2、体系架构 3、简单使用 3.1、环境准备 3.2、初始化master节点 3.3、建立worker节点 3.4、查看集群的节点信息 3.5、部署应用 3.5.1、创建Dockerfile文件 3.5.2、构建镜像 3.5.3、将镜像上传到Docker仓库 …

web前端之JS

文章目录 介绍一、JS引入到文件1.1 嵌入到HTML文件中1.2 引入本地独立JS文件1.3 引入网络来源文件 二、JS的注释三、JS输出方式四、JS数据类型4.1 判断数据类型 typeof4.2 charAt返回指定位置的字符4.3 concat连接两个字符串4.4 substring从原字符串提取字符串并返回4.4 substr…

Vue输入框或者选择框无效,或者有延迟

问题剖析 使用Vue这种成熟好用的框架,一般出现奇奇怪怪的问题都是因为操作不当导致的,例如没有合理调用组件、组件位置不正确、没有合理定义组件或者变量、样式使用不当等等... 解决方案 如果你也出现了输入框输入东西,但是没有效果…

(二)结构型模式:1、适配器模式(Adapter Pattern)(C++实现示例)

目录 1、适配器模式(Adapter Pattern)含义 2、适配器模式应用场景 3、适配器模式的UML图学习 4、C实现适配器模式的示例 1、适配器模式(Adapter Pattern)含义 将一个接口转换为客户端所期待的接口,从而使两个接口…

最强自动化测试框架Playwright(11)- 录制视频

视频 使用playwright,您可以录制测试视频。 录制视频 视频在测试结束时在浏览器上下文关闭时保存。如果手动创建浏览器上下文,请确保等待 browser_context.close()。 context browser.new_context(record_video_dir"vid…

互联网医院办理|沈阳互联网医院|医疗行业新机遇

互联网医院的办理不仅能为人们带来更便利、高效的医疗服务,更能缓解医疗资源紧张的问题,推动医疗服务的质量和效率提升。在这个充满信息化和科技变革的时代,互联网医院无疑是医疗行业向前迈进的重要一步。 1、提供全天候的医疗服务&#xff1…

重复delete 对象指针后的 异常调用栈怪异 解析

Release版VC6 MFC程序 程序正常退出时得到一个如下异常调用栈:​ 0:000> kb# ChildEBP RetAddr Args to Child WARNING: Frame IP not in any known module. Following frames may be wrong. 00 0019eb94 76124f2f 00c3afc8 0019ebdc 001…

Electron+vue3项目使用SQLite3数据库

SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,我们不需要在系统中配置。 就像其他数据库,SQLite 引擎不是一个独立的进程&am…

ChatGPT应用在律师行业需谨慎,南非有律师被它的幻觉误导了!

ChatGPT自去年以来大受欢迎,没想到它这么快会出现在法庭上。 最近,南非约翰内斯堡地区法院审理一个案件时,有律师因为使用ChatGPT生成的虚假参考资料而受到指责。[1] 根据《星期日泰晤士报》的报道,法院判决认为,该名…

IDEA Run SpringBoot程序步骤原理

这个文章不是高深的原理文章,仅仅是接手一个外部提供的阉割版代码遇到过的一个坑,后来解决了,记录一下。 1、IDEA Run 一个SpringBoot一直失败,提示找不到类,但是maven install成功,并且java -jar能成功ru…

pytest之测试用例执行顺序

前言 在unittest框架中,默认按照ACSII码的顺序加载测试用例并执行,顺序为:09、AZ、a~z,测试目录、测试模块、测试类、测试方法/测试函数都按照这个规则来加载测试用例。 而 pytest 中的用例执行顺序与unittest 是不一样的&#…