dash.js的ABR逻辑


参考:


dash.js ABR规则流程

  • 主要规则:使用DANYMIC算法,在ThroughputRuleBolaRule之间动态切换,切换规则为:
    • Startup:使用ThroughputRule
    • buffer超过10s时:若BolaRule选择的码率不低于ThroughputRule,则切换至BolaRule
    • buffer低于10s时:若BolaRule选择的码率低于ThroughputRule,则切换至ThroughputRule
  • 次要规则:使用次要规则选择码率,并与主要规则选择的码率对比,取其中较小值
    • InsufficientBufferRule
    • SwitchHistoryRule
    • DroppedFramesRule

*注:dash.js中,ABR逻辑音视频通用;若需在dash.js中实现自定义ABR算法,请参阅:如何在dash.js中添加自定义ABR规则?


1.主要规则

  • ThroughputRule
    • 使用滑动窗口平均估计未来吞吐量,选择不高于估计值的最大码率视频
      • 窗口大小为4~20(吞吐量抖动越剧烈,窗口越大),并对平均后的吞吐量×0.9作为估计值
    • 如果选择了最高码率,且buffer level高于rich buffer阈值,则在buffer level下降至该阈值之前不会选择更低的码率(即使吞吐量下降)
      • 该阈值通过【MediaPlayer】setRichBufferThreshold(value)设置
  • BolaRule(其核心原理参见:BOLA (INFOCOM ‘16) 核心算法逻辑,代码逻辑参见:BOLA dash.js代码实现
    • 使用BOLA-E,基于buffer选择码率,通过引入Placeholder算法改善了BOLA在startup或者seek时持续下载低码率视频块的问题
      • Placeholder算法
        • 出发点:有时(如startup或者seek时)buffer不能反应吞吐量信息
        • 原理:在buffer中插入placeholder segments(占位符段,不能播放)以提高buffer level,使得buffer-based方法具有足够的buffer信息来做出码率决策
        • 步骤:
          • 估计吞吐量
          • 根据估计吞吐量选择合适的码率
          • 计算允许BOLA进行码率决策buffer level
          • 在buffer中插入足够的placeholder段,以达到目标buffer level,所需的placeholder段数量等于目标buffer level减去buffer中的真实段数量
      • 当吞吐量估计值不足以支持高码率下载时,BOLA不会选择高码率
      • 记录buffer level下降的原因,当buffer由于非带宽原因下降时保持较高的码率选择

2.次要规则

  • InsufficientBufferRule
    • 目的:避免BOLA-E的Palceholder算法可能带来的卡顿
    • 规则:buffer较低时,使用保守的吞吐量估计值选择码率;卡顿发生时,强制选择最低码率以快速恢复
    • 步骤:
      • 将当前吞吐量估计×50%,得到安全吞吐量safe throughput
      • 将safe throughput×buffer level(不包含placeholder),得到safe download size
      • 下载大小不超过safe download size的块(即不超过safe download size / fragmentDuration的码率)
  • SwitchHistoryRule
    • 目的:避免码率抖动(频繁切换)
    • 规则:如果其他所有ABR规则都从某个码率开始下调码率选择,则8个segment内禁用该码率及更高的码率
  • DroppedFramesRule
    • 目的:避免由于CPU限制而无法正确渲染的码率
    • 规则:当某个码率下掉帧超过15%时,禁用该码率及更高的码率

3.进度监控规则

  • AbandonRequestRule
    • 规则:如果在块下载过程中有卡顿的风险,则取消下载当前块,转而下载码率更低的块以避免卡顿

4.自定义规则

  • 添加自定义规则至ABR规则合集:【MediaPlayer】addABRCustomRule(type, rulename, rule)
  • 使用自定义规则,禁用其他内置规则:【MediaPlayer】useDefaultABRRules(value)

代码调用流程

  • 【ABRRulesCollection】getMaxQuality()
    • DYNAMIC
      • 【ThroughputRule】getMaxIndex()
      • 【BolaRule】getMaxIndex()
    • 【InsufficientBufferRule】getMaxIndex()
    • 【SwitchHistoryRule】getMaxIndex()
    • 【DroppedFramesRule】getMaxIndex()

详见以下二图:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/LvGreat/article/details/103735968