简介
带宽预测是播放器实现码率自适应的技术基础。只有对当前的带宽预测的足够准确,才能够选择出当前场景下最优的码率进行播放。下面分别介绍下ijkplayer、exoplayer及VLC的带宽预测方法。
ijkplayer
ijkplayer的带宽预测代码位于ijksdl_timer.c中,核心思想是对过去时间点的网速进行采样,使用过去所有采样点的加权均值对当前带宽进行预测。其核心结构体为SDL_SpeedSampler2:
|
SDL_SpeedSampler2结构体的last_profile_duration和last_profile_quantity变量比较难理解,需要结合代码逻辑才能更好地解释,首先看下增加采样点的代码:
|
上面介绍了采样的过程,预测的过程就十分简单了,和采样的流程基本一致:
|
总结:ijkplayer巧妙地使用一个结构体保存了”所有“采样点的信息,并且实现了带宽的加权平均预测,这种方法相对于单独记录每个采样点信息的方式会比较省内存,但是一些较老的采样点是否仍应该被计算进来则有待商榷。(其实就是指数移动平均)
exoplayer
exoplayer同样使用采样的方式进行带宽预测,其代码位于SlidingPercentile.java中,使用了滑动窗口的方式限制了采样点的数量,先看下该类的主要成员变量:
|
采样点的结构比较简单,仅包含三个成员变量:
|
然后看下新的采样点是如何加入的:
|
最后看下预测部分的逻辑:
|
总结:exoplayer的核心思想就是使用滑动窗口对带宽进行预测。个人认为目前的计算方式有两点问题:1、目前的滑动窗口大小取决于数据量的大小,不能很好地确保采样点间的时间相关性;2、最终预测时将采样点列表按照下载速度排序,再一次弱化了时间相关性,暂时只能理解为exoplayer选择了较为保守的中值策略。
VLC
VLC的带宽预测同样使用了滑动窗口的思想,其主要逻辑位于MovingAverage.hpp中:
|
总结:VLC同样使用滑动窗口对网络带宽进行预测,预测算法中侧重于网络波动的影响,也淡化了时间的概念。(改进的指数移动平均)