一、带宽预测作用

控制音视频发送的数据量不会在网络带宽不够的时候,发送超出网络带宽的数据量。导致出现长延时和高丢包等问题,从而引发高延时或者卡顿的问题。

预测出实际的带宽,就可以控制音视频数据的发送数据量。如控制音视频数据的编码码率或者直接控制发送RTP包的速度

WebRTC中主要的带宽预测算法:

1、基于延时的带宽预测算法

2、基于丢包的带宽预测算法

3、最大带宽探测算法

二、基于延时的带宽预测算法:

主要是通过计算一组RTP包的发送时长接收时长,来判断当前延时的变化趋势

不断的实时调整更新带宽,来预测带宽

1、算法流程

  1. 计算一组RTP包的发送时长和接收时长,计算延时
  2. 根据当前延时和历史延时的大小来计算延时变化趋势
  3. 根据延时变化趋势判断网络状况;
  4. 根据网络状况调整更新预测带宽值;

2、计算延时

WebRTC中延时的是将RTP包按照发送时间来分组的,并且要求当前组中的第一个包和最后一个包的发送时间相差不能大于5ms,大于5ms则是新的一组的开始。

1、发送端在发送一个RTP包的时候,记录每一个包序号和实际发送时间,并将这些信息记录到一个历史数据里面。

2、接收端收到每一个包的时候,记录包序号和实际接收时间,每隔一段时间将这些信息组成Transport-CC发送到发送端。信息包括,每个包序号的包是不是接收到了;当前包相比前一个包的接收间隔。

3、发送端收到接收端的报文,就知道每一个包有没有被收到和接收RTP包的时间

4、通过以上信息计算出前后两组包之间的发送时长和接收时长。

  • 接收时长>发送时长,网络承受不了当前数据量,产生了缓存,从而产生延时
  • 接收时长=发送时长,没有延时
  • 接收时长<发送时长,之前网络带宽不够已经缓存了一部分数据,但网络在变好,快速从缓存中将数据发出
    为了避免网络抖动引起的噪声,需要通过当前延时和历史延时数据来判断延时的变化趋势,来平滑掉网络噪声引起的单个延时抖动。

3、Trendline Filter

平滑使用的滤波器Trendline Filter,用来计算得到延时变化趋势的。

Trendline Filter 保存了20个最近的延时数据,是经过平滑后的累计延时,它是通过前面计算得到的延时和历史累计延时加权计算之后得到。

使用最小二乘法,拟合曲线。

延时趋势还不能直接说明网络的变化方向,需要过载检测器

4、网络状态判断

过载检测器:

1、通过当前的延时趋势延时阈值来判断当前网络处于过载、欠载还是正常状态。

2、通过当前的延时趋势来更新阈值

有了延时趋势和延时阈值之后,可以计算网络状态。进而调整当前带宽值。这就需要速度控制器。

5、带宽调整更新

速率控制器主要工作是更新预测带宽值。维护一个状态机,状态机主要用来根据过载检测器得到网络状态和状态机目前所处的状态,来更新状态机的状态。上升、下降、保持。

  1. 下降状态,下降带宽,预估带宽等于0.85倍的接收码率
  2. 上升状态,调高预估带宽
    当前接收码率距离最大带宽比较远:当前接收码率大于最大带宽加上3倍的最大带宽标准差,或者小于最大带宽减去3倍标准差,使用乘性增,每隔1秒将预估带宽乘以1.08倍,但预估带宽不能大于1.5倍的接收码率。

当前接收码率距离最大带宽很近:当前接收码率大于最大带宽减去3倍标准差,并小于最大带宽加上3倍标准差。使用加性增。预估带宽没隔一个RTT,增加半个包的大小。

三、基于丢包的带宽预测算法

根据Transport-CC报文的信息计算丢包率,再根据丢包率的多少,进行带宽调整。

丢包率的计算:

lossrate = packet(lost))/packet(all)

1、带宽调整

  • 丢包率<2%,认为网络状况很好,需要调整高带宽值。带宽值等于过去1s钟所有预测得到的带宽值的最小值 * 1.08
  • 2%<丢包率<10%,不做带宽调整
  • 丢包率>20%,需要降低带宽值,带宽值等于当前预估带宽值_(1-0.5_丢包率)

在网络变差的时候,预估带宽会快速的被下调,但网络变好的时候,会比较缓慢的上升。这就有个问题,如画面从静止突然剧烈运动,即便实际带宽足够,还是会因为预估带宽不够而限制发送码率,从而导致出现模糊和马赛克等问题。这就需要第三种预测算法,快速探测出最大带宽。

四、最大带宽探测算法

  1. 发送端设定一个探测的目标带宽,一般发送时间是15ms,并给这些RTP包标上id
  2. 接收端收到统计包序号和接收时间,将结果组成Transport-CC 报文反馈给发送端
  3. 接收端收到Transport-CC报文后,根据id取出和发送时间并且和本端的历史数据送入到带宽计算器中
  • 根据发送端的探测RTP包总大小和探测RTP包的发送时间相除,得到发送端的最大带宽值
  • 根据接收端收到的探测RTP包总大小和探测RTP包的总接收时间相除,得到接收端的最大带宽值
  • 取两者中的最小值作为探测到的网络最大带宽值。如果接收端的最大带宽小于0.9倍的发送带宽,说明当前探测目标带宽已经最大,为保险起见,最后将最大带宽取接收端最大带宽的0.95倍。

如果当前过载检测器检测不是在过载状态,预估带宽值更新为探测到的最大带宽值

适用范围:

最大带宽探测算法,一般在程序刚启动的时候使用,并在程序运行的过程中进行周期性的探测。也可以再实际发送带宽很小的时候探测,防止出现因为实际发送码率很小,无法准确预测网络当前最大带宽的问题。

五、最终的预测选择

  1. 如果不是处于过载状态同时探测了最大带宽,预估带宽更新为探测到的最大带宽
  2. 取基于延时和基于丢包带宽预测得到的预估带宽的最小值。