webrtc发送端-transportfeedback之trendline

github:https://github.com/bigonelby/webrtcUml/tree/master/latest

webrtc-发送端-transportfeedback-trendling.drawio.png
  1. 这个图展示了webrtc中的transport-CC解析后的核心:trendline预测与码率评估

  2. 上张图介绍了,TransportFeedbackAdapter已经将所有的原材料都准备好了,在PacketResult中详细的记录了各个包的接收时间和发送时间,这里就可以进入到核心了,即DelayBasedBwe

  3. DelayBasedBwe由名称就可以知道,是基于延迟进行的带宽评估,这部分原本在接收端,最新的webrtc代码改进了这个行为,将这部分放在了发送端,也方便程序员的调试。那么帧到达的时间,就通过扩展RTCP包返回,即transport-cc。通过tranport-cc可以将包接收情况,包接收的时间返回给发送端。这部分内容前面已经介绍过了。因此,到了DelayBasedBwe,已经准备好了各个包的发送以及接收时间。模块将进行下一步的核心决策

  4. 整个决策分为三个部分:分组;过载检测;码率决策

  5. 分组模块即InterArrival,为何要分组呢?就是因为单个包的发送接收时间存在一定的偶然性,因此将相临近的包分为一组,模型数据更加可靠。分组的依据是什么呢?就是阈值kTimestampGroupLengthTicks。IntervalArrival模块记录了上一个包组prev_timestamp_group_以及当前包组current_timestamp_group_

  6. 记录包组的结构体为TimestampGroup,这个结构体中的size表示了包组的长度;first_timestamp,timestamp分别表示包组第一个包和最后一个包的发送时间;first_arrival_ms,complete_time_ms分别表示了包组第一个包和最后一个包的接收时间

  7. 通过InterArrival的NewTimestampGroup方法,判断当前packet是否属于新的包组了,判断的依据就是当前包的timestamp和包组的first_timestamp之差是否超过阈值kTimestampGroupLengthTicks,如果超过,则认为是新的分组,如果没超过,则还属于同一个分组

  8. 通过InterArrival模块,包被分成了包组,用包组的发送时间和接收时间,作为过载检测器的输入数据。过载检测器的接口为DelayIncreaseDetectorInterface,继承这个接口的就是TrendlineEstimator。接口有两个方法,其一是Update,即更新数据,即包组的发送和接收的时间;其二就是State,这个方法返回了当前探测出的网络状态,即BandwidthUsage,也就是kBwNormal还是kBwUnderusing亦或是kBwOverusing

  9. 如何决策出当前网络状态是正常还是过载还是不足呢?核心就是阈值比较。这里的阈值就是通过最小二乘法决策出的斜率。首先通过Update方法,出入包组相关数据,然后保存在delay_hist_中,这里保存的结构体为PacketTiming,有三个成员arrival_time_ms代表到达时间,raw_delay_ms是原始的延迟时间,即接收时间差减去发送时间差,smoothed_delay_ms是平滑后的延迟时间,是通过指数加权作用在raw_delay_ms,从而得出的数据。Trendline中的横坐标即为当前包组的到达时间 - 首包组到达时间;纵坐标为累积的平滑延迟。我们认为这些数据的关系是线性的,因此可以通过最小二乘法算出斜率。这个计算是通过LinearFitSlope计算出来的。

  10. 计算出斜率后,接着进入Detect方法,进行网络状态决策,首先对上一步决策出的斜率trend进行调整,得到modified_trend,再和阈值threshold_做比较,如果modified_trend > threshold_ 则为kBwOverusing;如果modified_trend < - threshold_ 则为kBwUnderUsing;否则即为kBwNormal

  11. 最后,通过UpdateThreshold更新阈值

  12. 通过以上两个步骤,已经得到了当前网络的状态是 正常 / 过载 / 不足。接下来通过码率控制模块rate_control_决策出具体的码率。这里的rate_control_即为AimdRateControl,所谓Aimd,就是和式增加,积式下降。输入为RateControlInput,这个参数是由DelayBasedBwe构建出来,并出入到Aimd模块的

  13. 首先调用Update方法,在这个方法中进一步调用了ChangeBitrate,在这里先调用了ChangeState,即通过上一次的rate_control_state_,结合过载检测器决策出来的BandwidthUsage,决策出当前的rate_control_state_。根据当前的rate_control_state_,决策在当前current_bitrate_的基础上进行和式增加或积式下降。并可以通过方法LastEstimate将决策出的current_bitrate_值返回

  14. 最后小结一下:这张图的核心就是DelayBasedBwe,入口就是IncomingPacketFeedbackVector,在这个入口里首先调用了IncomingPacketFeedback,在这个函数里,通过InterArrival模块进行分组,并通过TrendlineEstimator模块进行网络状态评测。之后DelayBasedBwe会通过MaybeUpdateEstimate方法决策是否需要更新码率,如果需要,即调用UpdateEstimate方法,这个方法构建了RateControlInput参数,并交给AimdRateControl模块进行最终的码率决策

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容