webrtc 带宽估计

本文详细解读了WebRTC中的带宽估计与码率控制算法,涉及延时梯度、卡尔曼滤波、Trendline滤波、丢包率计算、动态阈值调整及Aimd Rate Control。核心内容包括延时趋势判断、网络状态识别与码率调整策略。

        1、整体架构:

         此图是接收端码率控制整体结构图分成3个部分。
        第一部分采集和发送:camera encode通过Pacer并结合fec发送。
        第二部分基于延时的码率计算(卡尔曼模型)。
        第三部分是结合丢包和延时计算出综合码率发送编码器。

        notes:发送端带宽估计是一种算法。
        算法通过5步评估出基于延时的码率.1->2->3->4&5。

        到达时间模型:计算包组延时。
        到达时间滤波器:trendline即y=bx+a;x,y带入公式,计算斜率b,就是延时趋势.通过延时趋势计算延时。
        过载检测器:通过延时趋势trendline即协议b与门限比较,获得当前网络状态overuse,underuse, or normal。
        自适应阀值(门限):阀值也是每次更新。
        速率控制:根据过载检测器计算的网络状态结合当前码率状态,根据上面的流程图,获取新的码率状态并计算新的码率(不变,加,乘,减)。
        transport-cc是接收端发送给发送端的recv ts,是该算法的输入。
        卡尔曼滤波和trendline滤波类似,只是将第二步trendline滤波改成了卡尔曼滤波。

       2 发送端基于丢包率的码率控制

       接收端维护两个计数器,每收到一个RTP包都更新:

  1. transmitted,接收到的RTP包的总数;

  2. retransmitted,接收到重传RTP包的数量;

       某时刻收到的有序包的数量Count = transmitted-retransmitte,当前时刻为Count2,上一时刻为Count1;

        接收端以一定的频率发送RTCP包(RR、REMB、NACK等)时,会统计两次发送间隔之间(fraction)的接收包信息。

        接收端发送的RR包中包含两个丢包:

        一个是fraction_lost,是两次统计间隔间的丢包率(以256为基数换算成8bit)。

        一个是cumulative number of packets lost,是总的累积丢包

      2.1  丢包的计算方法

        1) 两次发送间隔之间理论上应该收到的包数量=当前收到的最大包序号-上个时刻最大有序包序号。

        2) 两次发送间隔之间实际接收到有序包的数量=当前时刻收到的有序包的数量-上一个时刻收到的有序包的数量  uint32_t rec_since_last = Count2 - Count1。

        3) 丢包数=理论上应收的包数-实际收到的包数。

        4)int32_t missing = exp_since_last - rec_since_last,missing即为两次发送间隔之间的丢包数量,会累加并通过RR包通知发送端。

        2.2 基于丢包的码率评估

        基于丢包的拥塞控制比较简单,其基本思想是根据丢包的多少来判断网络的拥塞程度.
丢包越多则认为网络越拥塞,那么我们就要降低发送速率来缓解网络拥塞;
如果没有丢包,这说明网络状况很好,这时候就可以提高发送码率,向上探测是否有更多的带宽可用.
实现该算法有两点:一是获得接收端的丢包率,一是确定降低码率和提升码率的阈值。

        发送端收到RTCP RR报文并接收丢包率后,根据公式计算发送端码率:当丢包率大于0.1时,说明网络发生拥塞,此时降低发送端码率,当丢包率小于0.02时,说明网络状况良好,此时增大发送端码率,其他情况下,发送端码率保持不变。

          Gcc算法在发送端基于丢包率控制发送码率,其基本思想是:丢包率反映网络拥塞状况。如果丢包率很小或者为0,说明网络状况良好,在不超过预设最大码率的情况下,可以增大发送码率;反之如果丢包率变大,说明网络状况变差,此时应减少发送端码率,在其他的情况下,发送端码率保持不变。

        Gcc使用的丢包率根据接收端RTP接收统计信息计算得到,通过RTCP RR报文返回给发送端,RTCP RR报文统计接收端RTP接收信息,如Packet Loss,Jitter,DLSR等等。

        最终码率会作用于Encoder,RTP, Pacedsender 模块,用于在编码器内部调整码率和平滑发送码率。

         接收端会通过rtcp rr将丢包率和丢包累计值反馈给发送端,发送端据此更新丢包率和rtt,具体逻辑后面会介绍 。

        3 接收端基于延迟的码率控制

        

        在发送端带宽估计由3个元素结合决定:
        基于丢包率估算的带宽(丢包率通过rtcp rr得到)、接收端的remb反馈的带宽、发送端带宽估,取三者带宽的最小值作为最终带宽估计值。 

         从上图可以看出,estimator基于延迟的拥塞控制是通过trendline滤波再进行过载判断,经过overuse detector,最后根据过载情况进行aimd码率调控评估出一个bwe bitrate码率.

          bwe bitrate码率会合丢包评估出来的码率和remb来决定最后的码率。

        notes:remb bitrate 仅做向下兼容使用。兼容老版本的KalmanFilter算法。

     transport-cc

https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01

        总结来看发送端会在session的层面统一对rtp包进行计算transport-cc sequence num,区别于之前的sequence num,原因是transport-cc目的是计算两点之间的带宽,两点通信可以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值