本期作者
陆元亘
哔哩哔哩资深开发工程师
2020年加入B站播放器团队,负责B站移动端点播播放体验的端智能建设。
01 传统自动分辨率算法的落地
 1.1 自动分辨率的背景
在网络基础设施升级换代的今天,流媒体的用户希望看到1080P、4K、8K等更高清的视频内容。一般而言,由于高分辨率视频的像素点更多,视频稿件的码率(单位视频时长的数据位数,单位kbps)也会指数级上涨。
但用户的下行网速却并不总是稳定高速的。高网速依赖于良好的网络基建,但从服务器到用户链路上的任意一环都有可能发生拥塞。尤其在用户的播放场景从家用电脑扩散到移动端的趋势下,完全避免网速的抖动更是不可能的。
为了解决卡顿,最直接的方法是加大播放时的缓存大小,通过削峰填谷的方式将高网速时期的带宽储备成缓存,减少了低网速时期的卡顿。但仅仅依靠缓存是不够的,缓存在网速低于视频码率的时候,终会消耗殆尽,导致卡顿。
因此能够在抖动的网速下,自适应地选择分辨率成为了提升播放流畅性的不二法门。自动分辨率算法(ABR,Adaptive Bitrate Algorithm)在流媒体技术兴起以来,一直在学术届和产业界收到青睐。ABR能够在兼顾高清画质和流畅播放的情况下,给用户提供更高的QoE(Quality of Experience),让用户不用再困扰于网络的抖动。
B站作为Z世代聚集的多元化视频社区,一直致力于给用户提供更优质的播放体验,下面我们就介绍下B站播放器团队落地ABR算法的进阶之路。
 1.2 自动分辨率现状
ABR算法主要通过历史网速和缓存信息,决策出下一个chunk(视频分片)的分辨率。按照先后顺序,业界经典的算法有THROUGHPUT、MPC、BOLA、Pensieve等,区别如下。
可以看出早期的ABR算法主要使用简单的公式对网速进行预测,中期的模型则兼容了缓存和网速因素,能够在高缓存的情况下给低网速更高的容忍度,同时提出了QoE公式(见下图),将ABR场景下的分辨率时长、卡顿和分辨率切换都纳入评价中,以此输出高清时间更长、卡顿率和切换次数较低的模型。
2017年的Pensieve是在ABR算法领域使用机器学习的代表作,通过调整QoE参数,开发者可以很快训练出满足预期的模型。同时神经网络模型相比于非机器学习的控制论模型,能够更好地捕捉住网速特征,预测出更精准的网速,以决策出更合适的分辨率。后续的机器学习模型大多是对Pensieve的改进,本文不再涉及。值得一提的是,大多数神经网络模型由于计算量较大,需要部署在服务端,本文将介绍一种将ABR神经网络模型转换为C++代码的方法,可以方便地部署在客户端,具体参考章节3.4模型部署。
 1.3 算法落地效果
B站将上文提到的4种算法全部集成到了客户端上,并对下载视频的过程进行分段,采集网速信息和缓存信息,每隔几秒调用一次ABR算法,决策下一分片的分辨率。在经过大规模AB测试以及调参后,总结各算法在不同网络环境下(区分平均网速的高低和抖动大小)的表现倾向(按照激进保守程度打分1-5,分数越高越激进,分辨率越高)如下:
  • THROUGHPUT算法只关注网速,在高缓存低网速的情况下也会降低分辨率。
  • MPC算法由于使用调和平均数,在网络抖动场景极易决策出低分辨率的结果。
  • BOLA算法所倚重的缓存可以抵抗网络的轻微抖动,分辨率并不容易下降。
  • Pensieve算法在各方面表现优秀,它能更好地预测出网速的趋势,并结合缓存来决策。
总体而言,BOLA和Pensieve算法在播放过程中可以更好地保持高清的体验,而THROUGHPUT和MPC则倾向于选择低分辨率以避免卡顿。
然而,在我们信心满满上线算法后,却发现用户并不买账。用户依旧大量从ABR选项手动选择到其他的分辨率上。
02 传统算法效果不佳的根因分析
通过埋点分析,用户切出ABR选项的主要场景有三个:
  1. 网速良好时,分辨率低于用户预期(用户手动切高分辨率)
  2. 网速不良时,发生多次卡顿的情况下,分辨率依然较高(用户手动切低分辨率)
  3. 用户切换到480P及以下的分辨率(用户手动切低分辨率)
场景1
主要根因分为起播和播放过程中。
一方面,起播时为了快速出帧一般会选用较低的分辨率,而ABR算法只能决策播放过程中的分辨率,不能改变起播分辨率,导致用户不满足起播的低分辨率,手动选择更高的分辨率。
另一方面,播放过程中用户拖拽进度条的行为也会导致缓存水平趋近于零,由于慢启动效应,此时测算的网速也较低,参考缓存的ABR算法极有可能误决策出低分辨率,引起用户不满。
同时,长视频播放过程中极有可能遇到网速抖动,在网速走低的情况下(在交通工具上信号不稳定),ABR算法会适时降低分辨率,但当用户网速恢复正常时(连上WIFI/移动信号变稳定),ABR算法需要继续下个多个低分辨率分片,在网速和缓存水平都较高的情况下,才能升高分辨率。长达数十秒的低分辨率是导致用户手动切出的重要原因。
场景2
占比较少,产生的主要根因是,在用户的网速较差的情况下,ABR算法参数过于激进,导致在缓存降低为0之前来不及切换到低分辨率。同时在发生卡顿后,ABR算法并未对此场景调整参数,导致用户出现连续卡顿,对算法失去信心。
场景3
该部分用户有较强的省流诉求,这类用户往往在使用流量播放时手动选择低分辨率来降低流量的消耗。此类问题并非算法能够解决,后面会在章节3.5用户倾向中介绍解决方案。
综上所诉,算法从论文到落地仅仅是个开始,为了最大程度提高用户体验,我们还需要做更多。
03 B站自动分辨率算法方案
为了解决传统算法的问题,我们将按照下面路径进行优化:
 3.1 基于主观评分的实时QoE模型
传统公式的缺点
首先需要明确的就是ABR优化的目标,论文中的QoE公式(见前文)是目前使用最广泛的,但其存在很多缺点:
  1. 缺乏权重标准,高清和流畅的重要性完全看参数如何设置
  2. 线性模型,表达力不足,扩展困难
  3. 只能评估一次播放的结果,无法评估过程
主观评分实验
因此,为了得到适合B站用户的QoE标准,我们选用不同稿件,模拟自动分辨率行为,设计了多组回放实验,实验因子如下:
  1. 起播耗时、起播分辨率
  2. 切换分辨率时间点、切换分辨率大小、切换分辨率次数
  3. 卡顿时间点、卡顿时长、卡顿次数
之后召集了大量用户进行主观评测,收集数据后,发现如下规律:
  1. 分辨率越高,评分越高,但分差越来越小
  2. 用户更喜欢一次长卡顿,而非多次短卡顿
  3. 起播卡顿(3秒以内)对评分影响较小,而播放过程中卡顿会较大降低评分
实时QoE模型
我们在阅读了QoE的文献后发现用户的感受具有记忆效应,一段时间内的卡顿和分辨率都会影响用户的感受,这更使我们确认了只用传统QoE公式是不合适的。我们需要的是优化用户的实时感受,在整个播放过程中如果用户的实时感受过低,都会导致用户切出ABR,甚至退出播放。
基于记忆效应,我们设计了实时QoE模型,可以计算用户的实时体感。计算过程如下:
  1. 起播时,QoE根据起播耗时和起播分辨率设置
  2. 发生卡顿时,QoE分数根据近期内的卡顿次数和卡顿时长进行扣除
  3. 切换分辨率时,QoE不会突变
  4. 无卡顿时,如果当前QoE与分辨率对应QoE不符,会按先快后慢的速度收敛到目标QoE
我们利用大量数据拟合了实时QoE模型的参数,该模型对于训练新的ABR模型,以及解释用户播放行为,均有重要意义。
 3.2 网速预处理
大家都知道,对于算法而言输入数据至关重要,要想决策出准确的分辨率,需要提高网速准确性
网速信息一般是用应用层下载每一分片的文件大小除以耗时来近似的。但这种方法存在两个问题:

耗时偏低
网速较大的场景,由于传输层堆积了大量未被拉取的音视频数据缓存,应用层获取数据的时间近乎为0,估测出的网速会偏大很多。解决方案是对大网速进行限制,避免ABR的决策过于激进。
耗时偏高
当CDN质量出现抖动需要超时重连时,应用层获取一个分片的时间就会额外加上一个等待超时的时间,估测出的网速会偏小很多。解决方案是识别超时重连是客户端的问题还是服务端的问题,如果是服务端问题,需要将超时时间减去,以得到准确的用户网速。
 3.3 智能分辨率框架
有了准确的网速输入和优化目标后,我们重新构建了广义的自动分辨率框架(包括起播和播放过程中的分辨率决策),将其统一命名为智能分辨率。框架图如下:
网络长期特征
ABR算法的输入只有最近8条网速,在预测未来分辨率上的决策是短视的。但增大输入长度对于模型训练来说是额外的消耗,而且大部分的分辨率切换发生在起播阶段,此时也没有足够的网速信息供决策。我们通过采集3分钟内多个视频的网速信息,从中提取了网速的分位值和波动特征。其中,网速的分位值表明了网速可以支持的分辨率,波动特征则表明网速未来可能变低的风险。这两个长期特征可以辅助算法模块决断,在用户网速特征发生变化时,算法模块可以自适应地调整参数,以进行激进或保守的决策。
起播分辨率
为了在起播时给用户更好的体验,我们在ABR算法的基础上完善了起播分辨率算法模块的建设。算法以过去30秒内的其他视频下载的分位网速为基准,参考网络长期特征,能在不增大卡顿率的前提下,给网速好的用户更高的起播分辨率。
播放过程中分辨率
播放过程中分辨率的决策还是使用Pensieve算法,我们用上文所述实时QoE模型替换传统的QoE公式,重新训练了模型。该模型能在提升3%左右的平均QoE,并且最小QoE也大幅提高。在训练调优过程中,我们对Pensieve源码的多处错误进行修正,同时对熵权重自适应调整,如果超过600个epoch内,训练集的奖励没有提升,就会自动对熵进行缩小,最终模型的训练耗时降低了80%。
另外一个重要模块是“升降分辨率决策中心”。当ABR决策出要升降分辨率时,该模块会参考网速特征和缓存情况简单判断是否应该升降,一方面可以规避ABR决策变换分辨率过于频繁的问题,另一方面对于拖拽进度条、单个网速异常偏高或偏低的问题,可以有效地抗扰动。
 3.4 模型部署
由于移动端设备算力的约束,大部分神经网络的ABR模型会部署在服务端。一方面这会造成部署成本的提升,另一方面服务端和客户端传输的不稳定性也会导致算法的可靠性下降。
B站参考2019年的论文《PiTree: Practical Implementation of ABR Algorithms Using Decision Trees》将神经网络的模型转换成决策树模型,并利用m2cgen库将决策树转换成数百行C++代码,可以优雅地部署在客户端上,大大降低了模型落地的难度,而且QoE的损失不超过1%。
 3.5 用户倾向
前面提到部分用户在流量场景有较高的省流诉求,其实不止如此,用户的诉求是千人千面的。我们将用户的倾向大致分为3种:
  • 高清:画质优先,不接受低画质,接受多次卡顿。
  • 自动:流畅为主,卡顿尽可能少的前提下,画质尽量高清。
  • 省流:带宽消耗低,对画质无追求。
针对这三种用户,我们正在新版本的APP中实验基于用户倾向的智能分辨率算法,给用户提供定制化的体验,欢迎大家体验和反馈。
04 总结与展望
总而言之,B站移动端点播在吸纳学术界ABR算法精华的基础上,成功落地了一套具有B站特色的智能分辨率解决方案,极大提升了用户体验。未来我们还会持续优化算法效果,并基于稿件和播放场景给用户提供更优的体验,欢迎各位读者与和我们一起研讨合作。
另外,在分析智能分辨率的拉流过程时,我们发现网络传输的耗时会极大影响智能分辨率的体验——低效的建连会导致切换分辨率时有较大几率卡顿,同时也导致采集网速不准确。因此,下一篇文章我们将会分享B站播放器团队在音视频网络传输领域的一些优化经验,敬请期待。

继续阅读
阅读原文