dash.js的ABR逻辑

本文深入解析dash.js中自适应比特率(ABR)算法的实现细节,包括主要规则如DANYMIC算法的动态切换策略,次要规则如InsufficientBufferRule的作用,以及自定义规则的添加方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


参考:


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()

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

任务4. 视频下载码率切换 在视频播放过程中,DASH允许客户端请求并播放任意码率的视频片段。在本实验中,请补全部分代码,对任务2中固定码率的下载方式进行更改。 实现一个简单的视频码率切换逻辑,以不同码率循环下载视频段。(line 65 in SimpleBitrateRule.js) 2接下来,你可以运行更改后的ABR算法,并观察码率切换现象。 任务5. 网络调控工具使用 请首先修改clumsy的运行权限,给予其管理员权限。(右键点击clumsy文件夹下的clumsy.exe,进入“属性”-“兼容性”,勾选“以管理员身份运行此程序”,点击确定。) 请注意:1)相比于原版clumsy,我们对程序进行了更改,使其可以模拟网络带宽波动。在启动程序之后,clumsy会读取bandwidth.txt中的内容,以更改当前可用带宽量(bandwidth.txt 共有两列数据,第一列表示带宽大小(kbps),第二列表示当前带宽大小所持续的时间(ms))。 2)退出程序即可结束模拟带宽波动。重新应用ABR算法不需要手动退出程序,程序会自动启动新的clumsy实例。3)完成实验后需要手动退出clumsy。 bandwidth.txt中的默认逻辑是:带宽保持9000kbps持续15秒,然后降低到8000kbps并持续10秒。之后会重复上述带宽变化过程。在本任务中,请将带宽更改为带宽保持9000kbps持续15秒,然后降低到2000kbps并持续10秒。 请做图并对比分析,在不同网络带宽下,任务4所实现的ABR算法的性能表现如何? 思考题. 视频码率切换决策 在任务4中,我们所实现的简单的码率切换算法是没有参考任务3中所提到的视频播放关键参数的,而是简单的每次下载视频段就切换码率。这样做会出现什么问题?请结合实验5的结果进行分析。并思考,我们有没有更好的视频码率切换方法呢?可以参考任务3所提到的那些视频播放关键信息呢?回答思考题
04-01
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Green Lv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值