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包都更新:
-
transmitted,接收到的RTP包的总数;
-
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目的是计算两点之间的带宽,两点通信可以

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

被折叠的 条评论
为什么被折叠?



