参考:
- ABR Logic · Dash-Industry-Forum/dash.js Wiki
- From Theory to Practice: Improving Bitrate Adaptation in the DASH Reference Player (MMSys’18)
dash.js ABR规则流程
- 主要规则:使用DANYMIC算法,在ThroughputRule和BolaRule之间动态切换,切换规则为:
- 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由于非带宽原因下降时保持较高的码率选择
- Placeholder算法
- 使用BOLA-E,基于buffer选择码率,通过引入Placeholder算法改善了BOLA在startup或者seek时持续下载低码率视频块的问题
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()
- DYNAMIC
详见以下二图: