当前位置: 首页 > news >正文

实时音视频通信的主要矛盾及解决方法

实时音视频通信的主要矛盾及解决方法

  • 实时音视频通信的主要矛盾及解决方法
    • 实时音视频通信的主要矛盾
    • 矛盾的解决方法
      • 增加带宽
      • 减少数据量
      • 适当增加延时
      • 提高网络质量
      • 快速准确地评估带宽
    • 总结
    • 参考

实时音视频通信的主要矛盾及解决方法

实时音视频通信的主要矛盾

实时音视频通信的主要矛盾就在于音视频服务质量与带宽大小、网络质量、实时性之间的矛盾。

矛盾的解决方法

增加带宽

增加带宽是最有效解决问题的根本。只要用户带宽足够,一切的问题可能就不是问题了。

可现实中我们很少能希望用户去提升带宽,且在多用户实时通信场景下,单个用户对带宽的提升对整体服务而言影响也不大,因为在这种场景下通信服务质量的好坏是由网络最差的那个用户决定的。所以这里增加带宽是指所有用户的带宽都增加。

增加带宽的具体方法:

  1. 首先,可以期待的是5G网络的普及。这会整体的提升所有接入5G网络设备的用户的网络能力。
  2. 然后,在客户端方面,WebRTC支持的选路方案是一个很好的方案,它可以按优先级选择最优质的网络连接线路。
  3. 最后,在服务端方面,可以通过提供更优质的接入服务、保证云端网络的带宽和质量、更合理的路由调度策略来提供更优秀的带宽。

1是被动方法,2和3是主动方法。

减少数据量

当网络带宽无法增加时,最有效的解决这一矛盾的方法就是减少音视频的数据量,虽然会牺牲音视频服务的质量。

通常有5种方法来减少数据量,分别是:

  1. 采用更好的压缩算法:比如使用H265,AV1等压缩率更高的编解码器。
  2. 使用SVC技术:SVC技术就是将视频按时间、空间及质量分成多层编码,然后将它们装在一路流中发给服务端。服务端收到后,再根据每个用户的带宽情况选择不同的层下发。
  3. 使用Simulcast技术:与SVC的分层思想类似,但它的实现更简单。就是将视频编码出不同分辨率的多路码流,上传给服务器。服务器则根据每个用户带宽情况选择一路最合适的流下发。
  4. 使用动态码率:当网络带宽评估用户带宽不足时,则通过编译器让其减小输出码率;而当评估带宽增大时,则增加输出码率。
  5. 甩帧或减少业务:这是一种下下策的方法,只有在用户网络非常差的情况下才可能使用。

上述方法中,使用最多的是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种常见的带宽评估方法:

  1. Goog-REMB
  2. Goog-TCC
  3. NADA
  4. SCReAM

目前在WebRTC中Google最新的Transport-CC算法(Goog-TCC)是表现最优秀的。

总结

在这里插入图片描述

总结一下,对于服务质量保障,首先提高网络质量,NACK和FEC解决丢包问题,JitterBuffer解决视频的乱序与抖动,NetEQ解决音频的乱序与抖动;带宽评估通过Goog-REMB和Goog-TCC,还有丢包的带宽评估;为了保障实时性,需要选择更优质的线路,比如客户端与服务端通信的时候选择更好的路线节点,保证云端网络带宽等等;从业务上,减少数据量可以用AV1、SVC、Simulcast、动态码率,减少业务;在防拥塞上,通过Pacer进行流控,只要能控制在500ms之内,适当增加时延也是可以接收的。

参考

  1. https://zhuanlan.zhihu.com/p/575264502
  2. https://avdancedu.com/2763ac60/
http://www.lryc.cn/news/342019.html

相关文章:

  • 【Delphi 爬虫库 4】使用封装好的 XML 解析库对 XML 数据进行解析
  • Flask简介
  • 神经网络中的归一化
  • 《从Paxos到Zookeeper》——第四、七章:基本概念及原理
  • 网络演进技术演进:裸纤专线、SDH、MSTP+、OTN、PTN、IP-RAN
  • MMC设备
  • 图片浏览器-PicView
  • 一些零碎小知识
  • 2.2 Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3-基础-Vue基本语法
  • (Arxiv,2024)Mind the Modality Gap:通过跨模态对齐建立遥感视觉语言模型
  • 区块链 | 一文了解 NFT 的生态系统(上)
  • 为什么centos官方版不支持arm架构?
  • awk小尝试2(随手记)
  • Vue的项目启动指令分析
  • 年轻人刮疯了,刮刮乐断货了
  • 25 JavaScript学习:var let const
  • docker部署的nacos2.2x开启鉴权功能
  • 【数据结构与算法】之五道链表进阶面试题详解!
  • vue2实现生成二维码和复制保存图片功能(复制的同时会给图片加文字)
  • Redis之字符串类型深入之SDS底层结构
  • Cesium 3dTileset 支持 uv 和 纹理贴图
  • C++可变参数模板中的省略号
  • uni-ui 使用uni-icons有些图标显示不出来,如down,up图标
  • 动态增删表格
  • Java-(乘法表之后)增强for循环
  • Celery(分布式任务队列)入门学习笔记
  • 【网络】tcp协议如何保证可靠性
  • select,poll,epoll
  • 【48天笔试强训】day18
  • 链表经典面试题01