webrtc技术探讨webrtc自适应编码

webrtc视频接收端带宽预测(三)---AimdRateCon

2017-06-12  本文已影响128人  ai___believe

本文主要探讨AimdRateControl.cc文件中的相关机制,这个Aimd就是加增乘减,就是通过之前得到的overuse,underuse,normal来得到接收端评估带宽,用来发送回给发送端,最后用来控制发送端实际发送码率。

更新input,包括
BandwidthUsage _bwState;//网络状态
uint32_t _incomingBitRate;//实际接收码率
double _noiseVar;//测量噪声方差

RateControlRegion AimdRateControl::Update(const RateControlInput* input,
                                          int64_t now_ms)
{
  assert(input);

  // Set the initial bit rate value to what we're receiving the first half
  // second.
  if (!bitrate_is_initialized_) {
    if (time_first_incoming_estimate_ < 0) {
      if (input->_incomingBitRate > 0) {
        time_first_incoming_estimate_ = now_ms;
      }
    } else if (now_ms - time_first_incoming_estimate_ > 500 &&
               input->_incomingBitRate > 0) {
      current_bitrate_bps_ = input->_incomingBitRate;
      bitrate_is_initialized_ = true;
    }
  }

  if (updated_ && current_input_._bwState == kBwOverusing) {
    // Only update delay factor and incoming bit rate. We always want to react
    // on an over-use.
    current_input_._noiseVar = input->_noiseVar;
    current_input_._incomingBitRate = input->_incomingBitRate;
  } else {
    updated_ = true;
    current_input_ = *input;
  }
  return rate_control_region_;
}

状态转移,由卡尔曼滤波结果,得到的网络状态,进一步得到现在的码率控制状态,即保持,减少和增加。



一共维持三个状态,增长、保持、衰减,状态转换根据OveruseDetector的三个状态(Normal, Overuse, Underuse)来进行判断。
当Overuse发生时,无论什么状态都进入衰减。
当Underuse发生时,无论什么状态都进入保持状态。
在保持和增长阶段,Normal状态将保持继续增长。
在衰减阶段,Normal状态会将状态拉回保持状态。

void AimdRateControl::ChangeState(const RateControlInput& input,
                                  int64_t now_ms) 
{
  switch (current_input_._bwState) 
  {
    case kBwNormal:
        if (rate_control_state_ == kRcHold) {
        time_last_bitrate_change_ = now_ms;
        ChangeState(kRcIncrease);
        }
        break;
    case kBwOverusing:
    if (rate_control_state_ != kRcDecrease) {
        time_last_bitrate_change_ = now_ms;
        ChangeState(kRcDecrease);
        }
        break;
    case kBwUnderusing:
        time_last_bitrate_change_ = now_ms;
    ChangeState(kRcHold);
        break;
    default:
        assert(false);
  }
}

参考文献:
[1] http://blog.csdn.net/MeRcy_PM/article/details/72629384

上一篇下一篇

猜你喜欢

热点阅读