webrtc中网络排队,基于趋势中值算法(MedianSlopeEstimator),用于推测网络的延迟趋势,延迟值。
用于计算直线 y=ax+b
- 创建对象
// window_size:窗口大小,最多这多点
// threshold_gain:MedianSlopeEstimator(size_t window_size, double threshold_gain):median_filter_(0.5){
</br>// [PercentileFilter类](https://mp.youkuaiyun.com/postedit/88687629 "PercentileFilter") </br>// median_filter_(0.5)用于获取列表中数据的中值
}
2.添加点
// 2个包间接收时刻差值
// 2个包间发送时刻差值
// 接收时间点
void Update(double recv_delta_ms,double send_delta_ms,int64_t arrival_time_ms){
//delta_ms:传输延迟增长值,随着网络排队的加重值会越来越大,反之会越来越小 // delta_ms:可能>0 , =0 ,<0 const double delta_ms = recv_delta_ms - send_delta_ms; ++num_of_deltas_; if (num_of_deltas_ kDeltaCounterMax) num_of_deltas_ = kDeltaCounterMax;> //累积的延迟增长值 accumulated_delay_ += delta_ms; // // 删除最早进来的老数据,维护一个固定窗口大小列表 if (delay_hist_.size() == window_size_) { for (double slope : delay_hist_.front().slopes) { const bool success = median_filter_.Erase(slope);> } delay_hist_.pop_front(); } for (auto& old_delay : delay_hist_) { if (arrival_time_ms - old_delay.time != 0) {> // // 跟历史上的所有点计算一下斜率变化,如果增加表示网络排队情况加重, // =0表示没什么变化 , <0 表示网络正在恢复 // double slope = (accumulated_delay_ - old_delay.delay) / static_cast<double>(arrival_time_ms - old_delay.time); //插入取中值列表中 **median_filter_.Insert(slope);** // 记录一下,用于数据过期后进行的删除操作 old_delay.slopes.push_back(slope); } } // // 类似push_back,但是直接通过参数进行构造的,不会进行对象的copy,性能更好一点 delay_hist_.emplace_back(arrival_time_ms, accumulated_delay_, window_size_ - 1); if (delay_hist_.size() == window_size_){ //计算出中值 trendline_ = median_filter_.GetPercentileValue(); } }
- 获取 斜率*threshold_gain_
double trendline_slope() const { return trendline_ * threshold_gain_; }