1.实时低延时和视频质量的矛盾
1.1 码流与带宽之间的矛盾。
码率越高,视频质量越清晰,但带宽是有限的,往往不能支撑大规模的高码流。
网络发生拥堵时,丢包等情况会导致画面丢帧、卡顿,此时若进行丢包重传,可能会增加网络负担,恶化拥塞情况。
1.2 实时性和服务质量之间的矛盾。
为了高实时性,通常选择udp作为网络传输协议,但udp不能保证传输可靠性,当发生丢包乱序时,造成花屏、卡顿,影响画面质量。
2.WebRTC拥塞控制策略
为了平衡低延时和视频质量的矛盾,在网路环境欠理想情况下,想要提成视频质量。WebRTC主要从网络拥塞控制算法GCC、接收端帧间插帧算法,抖动缓冲控制算法,NACK丢包重传技术、FEC前向差错纠正算法等模块进行处理。这里主要介绍拥塞控制算法GCC。
GCC是一种结合延时梯度和丢包率的拥塞控制算法,主要有2个版本:REMB-GCC和TFB-GCC,两者区别是:REMB-GCC将带宽计算等逻辑放在接收端进行,而TFB-GCC将此部分全部放在发送端,接收端仅定时发送RTCP来反馈收包的情况。当前WebRTC多使用TFB-GCC。
GCC基于延迟和丢包反馈的拥塞控制和带宽调整策略来实现网络延迟和画面质量之间的平衡。其流程大致分为:
-
- 接收端receiver根据已经收到的rtp报文进行排序,统计丢包情况和到达时间;
- 接收端定时通过rtcp报文来向发送端反馈时延和丢包情况;
- 发送端的estimator通过RTCP报文获取延时和丢包信息,动态的根据基于延迟和基于丢包来计算并调整发送端的编码码率,并改变pacer的码率;
- pacer根据此码率改变自身的网络发送速度,并以此发送速度来定时触发发送端sender的发包事件;
- 此过程一直循环。其中第三部分为GCC策略的关键,如何得到发送码率呢?
分为基于丢包率的码率计算和基于时延的码率计算两部分,最终对于两部分取小操作,得到最终码率。这两部具体的算法和公式,将在以后的文章里进一步介绍。