【融云分析】弱网环境下实时音视频通信的深度优化
5G 时代即将到来,这无疑将为移动网络带来巨大的容量升级和性能升级,高网速、低延迟、万物互连的特点,使得许多受制于网络的场景问题能够得到有效的解决,为全方位的物联网接入提供了基础设施上的支持。但在现阶段,网络状况并非一直处于理想状态,运营商之间的互通限制以及网络信号弱,链路不稳定等,时常会造成音视频通信延时和丢包的问题。如何在弱网环境下给予用户优质的音视频体验,是非常具有挑战性的。本文将从音视频用户体验的指标来介绍音视频相关知识,并详解如何优化网络延时和丢包问题。
实时音视频的用户体验指标
1、低延时:
实时音视频的要求是延时越低越好,如果端到端的延时超过 400ms ,用户就会有明显感知。
2、流畅度:
在实时音视频的场景下,通话双方接收到的音视频流畅平稳,不会出现卡顿、突然变快变慢等情况,这对于用户体验来说非常重要。
3、清晰度:
随着网络带宽的提高,用户对视频清晰度的要求越来越高,720P 和 1080P 开始慢慢普及。
4、连接建立及首帧时间:
用户在音视频通话过程中,连接建立和接通后接收到首帧画面的时间越短,用户的体验就越好。
延时和丢包是实时音视频影响用户体验的主要问题,延迟主要存在以下几个步骤:
1、客户端处理的延时
设备端上的延时:包括采集端采集、预处理、编码等方面,还有接收到之后的解码,处理、渲染等方面,都会有时间上的损耗,这些损耗的长短主要与硬件性能、采用的编解码算法等因素有关,设备端上的延时可达到 30~200ms,通常在 Windows 和 iOS 设备端上会小于 20ms,在 Android 设备端上可能会很长。
2、网络传输的延时
网络传输的延时主要集中在用户设备到服务器以及服务器与服务器之间的传输过程中,网络之间的传输不仅只是随着物理距离的增长而加大,也会因为跨区域或者跨运营商的传输而加大,尤其是在国内有很多中小运营商,会形成更为复杂的网络环境,那么延时会更高,通常在一个国家内部应该小于 50ms,国家之间可能大于 100ms。
3、抖动缓冲区
如果网络抖动比较严重,如3G、 Wi-Fi环境不稳定,数据包的rtt值不均衡往往会导致语音卡顿,丢字等现象,jitter buffer 模块通过缓存一段数据包,把数据包重排并均匀地传输给播放端,这样会增大端到端的延时。
如何优化延时?
1、客户端的优化
主要从编解码器算法优化、编解码参数调整和网络策略方面做调整。
a、编解码器算法优化可以通过提高编解码的压缩率,来减少带宽的延迟。
b、编解码参数调整是一个相对需要适配的过程,在不造成卡顿的基础上尽可能的调低延迟,比如:减小 Gop(减小视频关键帧的频率)、降低分辨率、减少 qp(压缩比)等。
2、网络传输的优化
融云在全球部署了多个数据中心,拥有数千个加速节点,搭建起了一张覆盖全球 233 个国家和地区的全球通信加速网络,互联网络达到专线品质,传输更安全、高效。这也为客户扫清了空间阻碍,让全球范围内的融云客户能享用稳定高效的实时音视频服务,用户就近接入数据中心,直接通过专线级联的方式来减少网络传输造成的延迟。
3、动态调整缓冲区
通过动态调整 JitterBuffer 在延时及抖动中找平衡,一个好的 JitterBuffer 应该是可以根据网络状况动态调整大小,网络状况比较好的时候,应该减少缓存大小,减小端到端的延迟。
移动网络时代的丢包现状
按照前文图中所示:通常一个用户 A 与用户 B 之间的通讯过程,是用户 A 设备通过网络连接到服务器,然后服务器与服务器进行直接通信,最后服务器再连接到用户 B。这里共有三个阶段,每个阶段都有可能造成丢包,如果再涉及到跨国的通信,那么就会出现非常高的丢包率。
当网络丢包严重时,音质会变差,画面帧速会下降,甚至出现卡顿。
如何优化丢包?
WebRTC 主要通过 FEC 和 NACK 来对抗网络丢包的情况:
- 前向纠错 FEC:主要通过数据包的冗余发送机制,这样当 A 数据包丢失时,可以用 B 数据包的冗余数据恢复 A 数据包,达到抗丢包的效果,但是增大了数据传输的带宽。
- 丢包重传 NACK:当接收方检测到 RTP 包有连续丢包情况时,它会发重传请求,发送方会重发这些数据,但不是所有情况下出现的丢包都会重传,如果网络延迟很高,就不适用 NACK 机制,因为这样会造成缓存过大,增大延迟,有些情况下我们可以通过请求关键帧的方式,来解析出图像,替代数据包的丢失重传。
针对 H.264 谷歌并不推荐同时使用 FEC 和 NACK, 因为 H.264 会判断丢失的数据包是不是关键帧或 P 帧,如果丢失的是一些 FEC 的冗余数据,这时候没必要发起丢包重传,所以综上所述,如何在丢包和延迟的网络环境下提供更好的用户体验,我们会通过判断丢包率和延迟的大小,来决定如何应对丢包,如果网络延迟很高,我们会采用 FEC 来处理,而如果网络延迟很低,则会采用 NACK 的方案。
除了以上方案,在对抗丢包还有 ARC 和 ARQ 等方案,但是每种方案都有自己的优缺点,如何能够在弱网下提供更好的用户体验,需要我们通过监测当前网络的状况,动态的选择优化策略,在不同方案直接寻找平衡。