范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

WebRTC拥塞控制算法

  背景
  网络拥塞是基于IP协议的数据报交换网络中常见的一种网络传输问题,它对网络传输的质量有严重的影响, 网络拥塞是导致网络吞吐降低, 网络丢包等的主要原因之一, 这些问题使得上层应用无法有效的利用网络带宽获得高质量的网络传输效果。特别是在通信领域, 网络拥塞导致的丢包, 延迟, 抖动等问题, 严重的影响了通信质量, 如果不能很好的解决这些问题, 一个通信产品就无法在现实环境中正常使用。丢包带宽估计
  基于丢包的拥塞控制比较简单,其基本思想是根据丢包的多少来判断网络的拥塞程度. 丢包越多则认为网络越拥塞,那么我们就要降低发送速率来缓解网络拥塞; 如果没有丢包,这说明网络状况很好,这时候就可以提高发送码率,向上探测是否有更多的带宽可用. 实现该算法有两点:一是获得接收端的丢包率,一是确定降低码率和提升码率的阈值。
  As_hat(i) =As_hat(i-1),2%<=丢包率<=10%,保持不变 As_hat(i) = As_hat(i-1)(1-0.5p),丢包率>10%,下降,p是丢包率 As_hat(i) = 1.05*As_hat(i-1),丢包率<2%,上升
  webrtc中发送端收到RTCP RR报文并解析得到丢包率后,根据下图公式计算发送端码率: 当丢包率大于0.1时,说明网络发生拥塞,此时降低发送端码率; 当丢包率小于0.02时,说明网络状况良好,此时增大发送端码率; 其他情况下,发送端码率保持不变。延迟带宽估计Goog-REMB
  基于接收端的延迟算法,利用延迟值,通过卡尔曼滤波器估计出下一时刻的网络带宽趋势,效果的准确性和公平性不如Transport-CC,目前已经被webrtc的新版本所淘汰Transport-CC
  基于发送端的延迟算法,也是利用区间延迟值,通过TrendLine滤波器(最小二乘法滤波器),通过斜率的增加或者减小来判断当前网络的拥塞状况时延梯度计算
  首先我们通过一张图看下时延梯度的计算:
  对于两个包组:i以及i−1,它们的时延梯度:
  在 WebRTC 中,延迟梯度不是一个个包来计算的,而是通过将包分组,然后计算这些包组之间的延迟,这样做可以减少计算次数,同时减少误差。 包组的划分原则为在一个burst_time间隔内的一系列的包构成一个组。建议burst_time为5ms.
  C++音视频开发 WebRTC 学习资料 :点击领取 →音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)
  TrendLine滤波器(最小二乘法滤波器)
  使用到了线性回归的方法进行时延趋势预测,通过最小二乘法求得拟合的直线斜率
  对于一堆样本点(x,y),拟合直线方程y=ax+b的斜率a按如下公式计算
  具体方式就是对距离平方和的最小值,根据求导推出a的值
  代码实现路径,goog_cc/trendline_estimator.cc,实现和上述推导公式一致absl::optional LinearFitSlope(     const std::deque& packets) {   RTC_DCHECK(packets.size() >= 2);   // Compute the "center of mass".   double sum_x = 0;   double sum_y = 0;   for (const auto& packet : packets) {     //计算x,y的总值     sum_x += packet.arrival_time_ms;     sum_y += packet.smoothed_delay_ms;   }   //计算x,y的平均值   double x_avg = sum_x / packets.size();   double y_avg = sum_y / packets.size();   // Compute the slope k = sum (x_i-x_avg)(y_i-y_avg) / sum (x_i-x_avg)^2   double numerator = 0;   double denominator = 0;   for (const auto& packet : packets) {     double x = packet.arrival_time_ms;     double y = packet.smoothed_delay_ms;     numerator += (x - x_avg) * (y - y_avg);     denominator += (x - x_avg) * (x - x_avg);   }   if (denominator == 0)     return absl::nullopt;   return numerator / denominator; }
  整体调用流程为LinearFitSlope  UpdateTrendline                 ↓ LinearFitSlope  LinearFitSlope                 ↓ TrendlineEstimator::Detect                 ↓ TrendlineEstimator::UpdateThresholdUpdateTrendline
  这个方法主要是做一些数据的统计计算之后,调用LinearFitSlope计算斜率void TrendlineEstimator::UpdateTrendline(double recv_delta_ms,                                          double send_delta_ms,                                          int64_t send_time_ms,                                          int64_t arrival_time_ms,                                          size_t packet_size) {     // 时延变化:接收时间差 - 发送时间差   const double delta_ms = recv_delta_ms - send_delta_ms;   ++num_of_deltas_;   num_of_deltas_ = std::min(num_of_deltas_, kDeltaCounterMax);   if (first_arrival_time_ms_ == -1)     first_arrival_time_ms_ = arrival_time_ms;    // Exponential backoff filter.   accumulated_delay_ += delta_ms;   BWE_TEST_LOGGING_PLOT(1, "accumulated_delay_ms", arrival_time_ms,                         accumulated_delay_);   //根据1)中的时延累积值计算得到平滑后的时延:smoothing_coef_为0.9   smoothed_delay_ = smoothing_coef_ * smoothed_delay_ +                     (1 - smoothing_coef_) * accumulated_delay_;   BWE_TEST_LOGGING_PLOT(1, "smoothed_delay_ms", arrival_time_ms,                         smoothed_delay_);    if (delay_hist_.size() > settings_.window_size)     delay_hist_.pop_front();    // Simple linear regression.   double trend = prev_trend_;   //当队列delay_hist_大小等于设定的窗口大小时,开始进行时延变化趋势计算,得到直线斜率   if (delay_hist_.size() == settings_.window_size) {     trend = LinearFitSlope(delay_hist_).value_or(trend);     if (settings_.enable_cap) {       absl::optional cap = ComputeSlopeCap(delay_hist_, settings_);       // We only use the cap to filter out overuse detections, not       // to detect additional underuses.       if (trend >= 0 && cap.has_value() && trend > cap.value()) {         trend = cap.value();       }     }   }   BWE_TEST_LOGGING_PLOT(1, "trendline_slope", arrival_time_ms, trend);   //传入trend来计算当前网络状态   Detect(trend, send_delta_ms, arrival_time_ms); } Detect
  该函数主要根据时延变化增长趋势计算当前网络状态。 在Detect函数内部,会根据前面计算得到的斜率得到一个调整后的斜率值:modified_trend:
  【 小编强力推荐 】音视频开发教程视频:【免费】FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发-学习视频教程-腾讯课堂
  C++音视频开发 WebRTC 学习资料 :点击领取 →音视频开发(资料文档+视频教程+面试题)(FFmpeg+WebRTC+RTMP+RTSP+HLS+RTP)
  void TrendlineEstimator::Detect(double trend, double ts_delta, int64_t now_ms) {   if (num_of_deltas_ < 2) {     hypothesis_ = BandwidthUsage::kBwNormal;     return;   }   const double modified_trend =       std::min(num_of_deltas_, kMinNumDeltas) * trend * threshold_gain_;   prev_modified_trend_ = modified_trend;   BWE_TEST_LOGGING_PLOT(1, "T", now_ms, modified_trend);   BWE_TEST_LOGGING_PLOT(1, "threshold", now_ms, threshold_);   //1.   if (modified_trend > threshold_) {     if (time_over_using_ == -1) {       // Initialize the timer. Assume that we"ve been       // over-using half of the time since the previous       // sample.       time_over_using_ = ts_delta / 2;     } else {       // Increment timer       time_over_using_ += ts_delta;     }     overuse_counter_++;     // 2/3     if (time_over_using_ > overusing_time_threshold_ && overuse_counter_ > 1) {        //4       if (trend >= prev_trend_) {         time_over_using_ = 0;         overuse_counter_ = 0;         hypothesis_ = BandwidthUsage::kBwOverusing;       }     }   } else if (modified_trend < -threshold_) {     time_over_using_ = -1;     overuse_counter_ = 0;     hypothesis_ = BandwidthUsage::kBwUnderusing;   } else {     time_over_using_ = -1;     overuse_counter_ = 0;     hypothesis_ = BandwidthUsage::kBwNormal;   }   prev_trend_ = trend;   UpdateThreshold(modified_trend, now_ms); }
  const double modified_trend = std::min(num_of_deltas_, kMinNumDeltas) * trend * threshold_gain_;
  num_of_deltas_ 表示包组间延迟梯度计算的次数,取值范围是 [2, 60],threshold_gain_ 是 Trendline 滤波器的增益参数,其默认值为 4,这两个变量都会对延迟梯度趋势值进行放大。 这里的关键就在于为何要放大 的意义trend在于是一个斜率值,取值范围 (-1, 1),这个值很小,而阈值 要跟随 的变化而变化,这可能导致 很容易的超过 从而触发连续的过载信号。放大 可以使得算法不会因为 的波动而过于敏感。
  判断为过载的条件延迟梯度斜率值 > 当前阈值过载总时长 > kOverUsingTimeThreshold(10ms)过载次数 >1当前延迟梯度斜率值 > 上一次的延迟梯度斜率值,即延迟在不断恶化。UpdateThreshold
  阈值threshold_动态调整为了改变算法对时延梯度的敏感度。根据主要是,时延梯度是变化的,有时很大,有时很小,如果阈值是固定的,对于时延梯度来说可能太大或者太小,这样就会出现检测不够敏感,无法检测到网络拥塞,或者过于敏感,导致一直检测为网络拥塞;void TrendlineEstimator::UpdateThreshold(double modified_trend,                                          int64_t now_ms) {    //根据斜率上升还是下降定义K系数 k_down_(0.039)  k_up_(0.0087),   const double k = fabs(modified_trend) < threshold_ ? k_down_ : k_up_;   const int64_t kMaxTimeDeltaMs = 100;   //计算上一次更新time的时间,和100ms取最小值   int64_t time_delta_ms = std::min(now_ms - last_update_ms_, kMaxTimeDeltaMs);    //将k和time_delta_ms,进行计算,更新阈值   threshold_ += k * (fabs(modified_trend) - threshold_) * time_delta_ms;   threshold_ = rtc::SafeClamp(threshold_, 6.f, 600.f);   last_update_ms_ = now_ms; }

生命中最难的阶段,不是没有人懂你,而是不懂你自己!培养自信的方法,那就是做你所怕做的事,去获得一次成功经验的记录。最佳的报复不是仇恨,而是打心底发出的冷淡,干嘛花力气去恨一个不相干的人。所有人的人生都没有意义,但这不代表人生必然空没有人能够打败你,除了你自己人生不如意十有八九。生活的苦难总会不经意降临。强者,勇敢面对并且战胜它。弱者,怨天尤人,陷入苦难的沼泽无法自拔。自己才是最大的敌人。没有人能够打败你,除了你自己。云是新近认识的一个夜深了,还是睡不着,满脑子都是你的样子头条创作挑战赛明明很想你,却再也找不到理由去见你,缘分许了我们一场相遇,可是又不能让我们在一起,孤单的夜里,空中蔓延着我对你的想念。夜深了,还是睡不着,满脑子都是你的样子,这世上总知己情人,相爱一生文安冬悦听闻爱情,十有九悲,真正走到最后,幸福一生的人,很少。可尽管如此,人们依旧对爱情充满期待。爱情对于每一个人来说,都非常重要。没有爱情的人生是不完整的,充满遗憾的。怀着对爱情开门红!田亮14岁女儿国际赛首秀横扫,力扛2大不利,休伊特点赞虽然只有14岁,而且只是青少年国际首赛秀,但田雨橙的比赛却备受外界关注,这一切主要是因为她有一个明星爸爸奥运冠军田亮。1月31日,在新加坡J30首轮一场补赛中,田雨橙直落2盘横扫本田亮女儿打网球,刘国梁女儿打高尔夫球,那么,姚明女儿呢?中国体坛圈又一女儿继承父业!根据ITF官网显示,前奥运会冠军田亮女儿森碟,真名田雨橙,将参加新加坡青少年冠军赛J30。这也是田亮女儿获得外卡首次亮相国际职业网球赛场。不少网友为田亮清荷札记写给女儿,爱的情怀写给女儿,爱的情怀作者清荷札记宝贝丫头,乘风破浪,踏破世俗的眼光,去追寻你的光,爱是治愈彼此人生滚烫的阳光。学会看淡一些事情,是对自己最好的保护。别让负能量消耗你内心的晴朗,时光的助攻涨2。4倍!辽篮32岁旧将复苏,不比赵继伟差,李楠看人有眼光CBA本赛季进行了一多半,要说进步明显的肯定是来自江苏省的两支球队,南京同曦自从升入顶级联赛以后一直是底层的鱼腩,但今年已经成为黑马球队之一,有机会进入季后赛。与此同时江苏肯帝亚也郭富城为香港旅遊发展局拍攝宣传短片郭富城在1990年代,代表香港乐坛四大天王之一。除了演艺事业外,还热衷于公益慈善。2000年成立郭富城国际慈善基金会,2003年当选香港十大杰出青年,2011年担任联合国儿童基金会东体武磊三胎是女儿,当初进行职业生涯规划时已考虑此事直播吧2月3日讯昨晚,武磊传来喜讯,他的第三个孩子顺利降生。据东方体育日报报道,武磊的第三个孩子是女儿,此前在进行职业生涯规划时,武磊已经考虑此事。此前武磊已经有一儿一女,凑成一个香港高才通高才通签证激活必须注意事项1已有其他香港签证并身处香港的,在高才通获批后,需要重新入境才能激活,入境时必须走人工通道。2已有其他香港签证的申请者,高才通获批后,第一次签证的时间是2年,原来在港的时间将会和高
NBA常规赛MVP解读历史上关于MVP奖项的6个最荒谬的评选,有争议从同一赛季没有入选最佳阵容一队的球员获得MVP,到年度最佳防守球员成为最佳防守阵容的第二阵容,NBA的常规赛MVP奖项的评选在历史上确实有一些令人头疼的时刻,有时是因为媒体决定了一2K23球星评分提前曝光!詹杜库约都是96威少沃尔同为78北京时间9月6日,NBA2K系列的球员评分,一向是球迷们关注的热点话题。目前,2K23的不少球员评分已经在社媒上曝光,詹姆斯杜兰特库里和约基奇同为96,东契奇95,伤愈复出的小卡达C罗扫清阴霾一战即将到来,联赛沉寂欧战开花,是时候证明自己了曼联最近士气正盛,联赛豪取四连胜,滕哈格肩上的压力也瞬间减轻不少。上轮联赛,他们在老特拉福德战胜了新赛季唯一保持全胜战绩的阿森纳,这下子彻底将红魔的心气提上来了。上轮联赛,一亿新援确定水了!才23岁!堂堂第六顺位,连个刮奖的都没有事情大概是这样,几天前,知名体育媒体BR重排了2019届的选秀,重排结果当中,原先的前五顺位全部出现在了乐透区,具体如下锡安,原本第1,重排第1莫兰特,原本第2,重排第2巴雷特,原铸梦破空和逐风相继加强,头疼医脚的做法真的未来可期吗?大家好我是指尖,体验服铸梦系列的两件装备终于加强,算得上是众望所归了,两件装备设计的初衷是给射手们更多的选择,然而实际上的使用体验却不能如意,因为装备设置了边框,所以太过局限性,仅夏季赛EDG大爆冷门,惨遭TES零封!宁王突然自信起来了?在经过此前一段时间的激烈争夺之后,今年的英雄联盟LPL夏季赛也逐渐接近尾声,在此期间全网游戏玩家都对这场比赛产生浓厚兴趣。与此同时在近日的赛程当中EDG与TES两支队伍成功会师半决OutofCards卡牌设计周赛第五季第十八期活死人黎明第五季第十八期活死人黎明为假定的死亡骑士新兵扩展包设计一张传说随从牌。你设计的牌不能带有新关键词。本期链接玛洛加尔领主6费随从55亡语如果此时是你对手的回合,再次召唤该随从。作者U2022年POPMART海外线下快闪店疯狂布局从2022年11月15日起,泡泡玛特在澳大利亚新西兰日本韩国等地落地近20家圣诞快闪店。截止到2022年7月底,泡泡玛特的全球快闪店已陆续落户美国加拿大英国等欧美国家,让海外粉丝感入秋后,建议中老年少吃鸡肉茄子,多吃2肉2素,润肺不上火大家好,我是大白。三伏已过秋转凉,老祖宗告诉我们,饮食上要顺时而食,就是在不同的季节吃不同的食物,你吃进去什么,身体就会反应什么。秋季是凉爽又干燥的,饮食上以滋补多喝水为主,忌吃燥如何快速解酒,这四点要记牢亲朋好友相聚,总免不了推杯换盏,不时会喝得酩酊大醉。大多数醉酒的人,第二天起来会觉得头晕头痛或肠胃不适。有的老年人还会出现血压波动,诱发心脑血管意外。这些问题都是由宿醉造成的。什么巴萨又1巨亏交易6000万引进,300万甩卖!两年0球0助攻9月6日,权威的转会记者罗马诺确认巴萨中场皮亚尼奇将于今晚飞赴阿联酋,商讨加盟阿联酋联赛沙迦俱乐部的事宜。西甲的夏季转会窗口已经关闭,但巴萨的工作并未完成。这个夏窗,巴萨送走库蒂尼