本文主要总结自李超老师的讲WebRTC原理的书。有兴趣的同学也可以直接看书,书中讲述更详细。
实时音视频通信的目标
对于互动性很强的实时通信场景,比如上课、视频会议等。相比于线上,我们都更喜欢线下交流。这主要是因为线下交流会更有“真实感”。那么线上交流的“真实感”缺失在哪呢?
主要有2个方面:
- 实时性损失。音视频经过网络传输后必定带来延时,这种延时对于一些互动性较强通信场景就是不能忍受的了。
- 业务数据的损失。这个主要就是因为设备等因素的限制而无法完全还原直播现场全部的真实场景,包括现场氛围等。
在此基础上,可以总结出,实时音视频通信追求的本质是尽可能逼近或达到面对面交流的效果。
实时音视频通信的指标
在实时音视频通信的场景中有2个指标可以很好的评估通信的“真实感”。一是通信延时,二是音视频服务质量。
通信延时指标
延时 | 人的感受 |
---|---|
200ms | 非常优质,如同在一个房间里聊天 |
300ms以内 | 大多数很满意 |
400ms以内 | 有小部分人可以感觉到延迟,但还基本可以进行互动 |
500ms以上 | 延迟明显,影响互动,大部分人不满意 |
这个表是实时通信的延时指标。可以看到,在需要互动的场景下,延迟大于500ms以上就会对互动有很大的影响了。
引起延迟的因素很多,比如音视频采集、编码、传输、渲染等等这些处理过程都会带来延迟。其中,网络传输的延迟是最难评估和控制的,因为影响它的因素众多,且其变化是动态的。
音视频服务质量指标
音视频服务质量分为音频和视频的,但音频的数据量较小,对网络影响不大,主要影响网络的视频服务质量。
视频服务质量和视频的分辨率、帧率、码率是息息相关的。在实时音视频通信场景下,头像视频的默认分辨率一般为640*480或640*360,帧率至少是15帧/秒。在相同分辨率时,码率越大,视频就越清晰。但码率也会有限制,一般超过一定阈值(MOS=5)后,再大的码率就没有意义了。
这里简单说明下,MOS值是平均意见值,有主观和客观之分,是用来评估音视频服务质量好坏的。一般而言,5分表示优秀,4分表示较好,3分表示还可以,2分表示差,1分表示很坏。
一般情况下,以h264编码为例,如果希望视频的MOS值为4,分辨率为640*480时需要1.9Mbps的码率,分辨率为1920*1080时,需要7Mbps的码率;而希望视频的MOS值为3,分辨率为640*480时需要0.5Mbps的码率,分辨率为1920*1080时,需要2.5Mbps的码率。可以看到,MOS值越高,视频质量越好,码率也就越大,需要的带宽也就越多。
因此,要提高实时音视频的“真实感”,就需要尽可能地降低传输的延迟,同时增大传输的码率。然而,降低延迟和增大码率是矛盾的,除非所有用户的带宽都足够多且网络质量都足够好。
实时音视频通信的主要矛盾
从前面叙述中可以总结出,实时音视频通信的主要矛盾就在于音视频服务质量与带宽大小、网络质量、实时性之间的矛盾。解决这个主要矛盾的方法主要有5种。
增加带宽
增加带宽是最有效解决问题的方法,只要用户带宽足够,一切的问题可能就不是问题了。可现实中我们很少能希望用户去提升带宽,且在多用户实时通信场景下,单个用户对带宽的提升对整体服务而言影响也不大,因为在这种场景下通信服务质量的好坏是由网络最差的那个用户决定的。所以这里增加带宽是指所有用户的带宽都增加。
- 首先,可以期待的是5G网络的普及。这会整体的提升所有接入5G网络设备的用户的网络能力。
- 然后,在客户端方面,WebRTC支持的选路方案是一个很好的方案,它可以按优先级选择最优质的网络连接线路。
- 最后,在服务端方面,可以通过提供更优质的接入服务、保证云端网络的带宽和质量、更合理的路由调度策略来提供更优秀的带宽。
减少数据量
当网络带宽无法增加时,最有效的解决这一矛盾的方法就是减少音视频的数据量。
通常有5种方法来减少数据量,分别是:
- 采用更好的压缩算法,比如使用h265,AV1等压缩率更高的编解码器。
- 使用SVC技术,SVC技术就是将视频按时间、空间及质量分成多层编码,然后将它们装在一路流中发给服务端。服务端收到后,再根据每个用户的带宽情况选择不同的层下发。
- 使用Simulcast技术,与SVC的分层思想类似,但它的实现更简单。就是将视频编码出不同分辨率的多路码流,上传给服务器。服务器则根据每个用户带宽情况选择一路最合适的流下发。
- 使用动态码率。当网络带宽评估用户带宽不足时,则减小输出码率;而当评估带宽增大时,则增加输出码率。
- 甩帧或减少业务。这是一种下下策的方法,只有在用户网络非常差的情况下才可能使用。
适当增加延时
在网络抖动的情况下,使用缓冲队列来平滑处理数据,这种适当增加延时的方法也是可以解决部分业务质量和网络之间的矛盾的。这种方式在WebRTC中也是有应用的,比如PacedSender。
提高网络质量
提高网络质量的前提是网络没有发生拥塞。可以从丢包、延迟、抖动三个方面来评价网络质量的好坏。
- 丢包,是完了传输过程中对网络影响最大的指标,优质的网络丢包率不超过2%。对于WebRTC而言,大于2%且小于10%的丢包率是正常网络。
- 延迟,相对丢包来说对网络影响要小点。如果网络中延迟持续增大,则可能是网络中发生了拥塞。
- 抖动,对网络影响最小。一般的抖动都可以通过缓冲队列来解决。
在WebRTC中有很多提高网络质量的方法,比如NACK、FEC、JitterBuffer、NetEQ和GCC等。
快速准确地评估带宽
只要能够快速准确地评估出带宽,通常就能有效的防止网络拥塞的发生。目前在WebRTC中Google最新的Transport-CC算法是表现最优秀的。
总结
到这里,可以看出,在实时音视频通信中想做到“既要,又要,还要”是非常难的。这里放一张李超老师总结的思维导图一起学习下。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。