心胸决定格局,眼界决定境界...

webrtc中的带宽自适应算法

webrtc中的带宽自适应算法分为两种:

1, 发端带宽控制, 原理是由rtcp中的丢包统计来动态的增加或减少带宽在减少带宽时使用TFRC算法来增加平滑度。

2, 收端带宽估算, 原理是并由收到rtp数据,估出带宽; 用卡尔曼滤波,对每一帧的发送时间和接收时间进行分析, 从而得出网络带宽利用情况,修正估出的带宽

 

两种算法相辅相成, 收端将估算的带宽发送给发端, 发端结合收到的带宽以及丢包率调整发送的带宽

 

下面具体分析两种算法:

 

2,  接收端带宽估算算法分析

     结合文档http://tools.ietf.org/html/draft-alvestrand-rtcweb-congestion-02以及源码webrtc/modules/remote_bitrate_estimator/overuse_detector.cc进行分析

     带宽估算模型: d(i) = dL(i) / c + w(i)     d(i)两帧数据的网络传输时间差,dL(i)两帧数据的大小差, c为网络传输能力, w(i)是我们关注的重点, 它主要由三个因素决定:发送速率, 网络路由能力, 以及网络传输能力。w(i)符合高斯分布, 有如下结论:当w(i)增加是,占用过多带宽(over-using);当w(i)减少时,占用较少带宽(under-using);为0时,用到恰好的带宽。所以,只要我们能计算出w(i),即能判断目前的网络使用情况,从而增加或减少发送的速率。

 

     算法原理:即应用kalman-filters
     theta_hat(i) = [1/C_hat(i) m_hat(i)]^T   // i时间点的状态由C, m共同表示,theta_hat(i)即此时的估算值

     z(i) = d(i) - h_bar(i)^T * theta_hat(i-1)  //d(i)为测试值,可以很容易计算出, 后面的可以认为是d(i-1)的估算值, 因此z(i)就是d(i)的偏差,即residual

     theta_hat(i) = theta_hat(i-1) + z(i) * k_bar(i) //好了,这个就是我们要的结果,关键是k值的选取,下面两个公式即是取k值的,具体推导见后继博文。

                              E(i-1) * h_bar(i)
     k_bar(i) = --------------------------------------------
                  var_v_hat + h_bar(i)^T * E(i-1) * h_bar(i)

     E(i) = (I - K_bar(i) * h_bar(i)^T) * E(i-1) + Q(i)   // h_bar(i)由帧的数据包大小算出

     由此可见,我们只需要知道当前帧的长度,发送时间,接收时间以及前一帧的状态,就可以计算出网络使用情况。

     接下来具体看一下代码

 

void OveruseDetector::UpdateKalman

BandwidthUsage OveruseDetector::Detect

 

posted @ 2015-12-18 18:28  WELEN  阅读(1385)  评论(0)    收藏  举报