实时通信与带宽大小网络质量息息相关,根据香农定理和奈奎斯特定理其实很容易知道,码率、延迟和服务质量本身就是相悖的。而再加上信号传输本身的带宽有限(排除WebRtc中使用的架构),更加难以达到一个均衡。
那么为了提高音视频服务质量又该如何下手呢。有以下五个方面,这篇文章主要记录每个方面的一些重要算法。
- 增加带宽
- 减少数据量
- 适当增加时延
- 提高网络质量
- 快速准确评估带宽
增加带宽
首先应该提到的肯定不是WebRtc中的一些算法,而是譬如5G网络,星链,新型传输材料,波分复用,时分复用,频分复用,等等通信方向的知识。但这并不在将要探讨的WebRtc框架体系之内。
在WR内,客户端方面主要使用了一种极妙的选路方案来提高整体通信的带宽,即TURN-STUN结构。
STUN-TURN架构
减少数据量
- 压缩算法,通过更好的压缩算法可以实现更高的码率
- SVC技术,将视频按照时间、空间、质量分成多层编码、,然后将他们装在同一路发送给服务端,服务端收到后再根据每个用户的带宽情况不同来选择不同的层下发。
- simulcast,将视频编码分成多个不同分辨率的多路码流,然后上传至服务端,服务端在根据客户的不同情况来进行下发。
- 动态码率
- 甩帧,减少业务
增加时延
实际上增加时延是增加一个缓冲区,先把到来的数据方法队列中缓冲一下,这样的话就可以减少网络抖动造成的卡断、快播、吞音等现象。一般而言对于实时音视频延迟应该控制在500ms以内。例如Jitterbuffer
提高网络质量
对于网络质量主要有三个影响因素
- 丢包,优质网络丢包率应该小于2%,对于WR丢包率应该限制在2%-10%
- 延迟,拥塞
- 抖动,抖动较小的情况下,可以通过循环队列将其消除,抖动过大就会将乱序包作为丢包处理。在WR中抖动时长不能超过10ms,超过10ms会被视为丢包
解决上面问题的方法:
- NACK/RTX NACK是RTCP的一种消息类型,向接收端报告一段时间内有哪些包丢失了,RTX是指向发送端重新发送丢失包
- 前向纠错,使用异或方式进行发送,以便在丢包时可以通过这种机制恢复丢失的包
- NetEQ 用于音频的防抖动