作者:来自 vivo 互联网短视频研发团队
本文依据蔡守业、马运杰老师在“2023 vivo 开发者大会 ” 现场演讲内容整顿而成。
在线点播场景,播放体验晋升与老本优化是等同重要的两件事,并在局部场景体验优化与老本优化存在肯定的互斥关系。vivo 短视频深入分析播放链路的每个环节、并联合大数据统计,摸索出了多种的体验优化策略;同时针对老本优化,上线了转码、PCDN、共享闲时带宽等多种策略用于升高带宽老本。基于技术优化和业务倒退的要求,vivo 短视频还上线了系统性的监控体系,对播放体验、带宽老本进行了多维度的监控。
一、业务介绍
vivo 短视频我的项目的业务架构,从链路上来说,次要包含:
- 内容生产,次要包含拍摄、导入、剪辑以及作品上传
- 视频解决,包含画质加强、转码、压缩等
- 散发
- 生产,包含预加载、视频播放
除此之外,咱们还设计了若干个子系统,其中比拟重要的有:
- 日志收集,次要用于收集用户被动反馈问题。
- 监控统计,次要用于监控线上外围指标,为后续优化提供方向。
- AB 测试,次要用于新性能验证。
技术架构的最终目标是为了给用户出现一个有着良好体验的产品,同时又兼顾到开发、经营老本。通过咱们产品内置的意见反馈、大数据统计以及用户调研,咱们发现 / 用户对 vivo 短视频的反馈次要集中在播放卡顿、不晦涩、画质不清晰下面,从老本方面,咱们的次要压力来自于 CDN。
这些也就是本文的主题,即:如何做到既要播放体验好,又要业务成本低。接下来,将别离介绍一些在播放晦涩度以及老本优化相干的摸索和实际。
二、体验优化
2.1 播放链路拆解
对于在线点播场景来说,影响用户体验的环节次要在视频开播以及播放过程。首先,在起播阶段,应尽力做到首帧零耗时,当用户观看视频时应间接展现视频画面而不是呈现期待过程。
咱们对开播过程做了拆解和监控,在无任何优化策略的场景下,网络连接环节耗时占比 30%,下载环节占比 15%,解封装、解复用环节占比 15%。
其次,在视频播放过程中,应做到晦涩播放不卡顿,这就须要正当的预加载策略、码率管制以及下载策略。
通过以上的剖析,确定了咱们 4 个重点 优化方向:
- 建连优化,通过连贯复用、保活等形式缩小在连贯环节的耗时
- 分片下载,通过优化下载架构晋升下载速度以及成功率
- 预渲染,把耗时的解封装、解复用、解码等环节前置
- 数据预加载,通过预加载缩小在下载环节的耗时
在此基础上,咱们上线了数据监控体系,对开播性能、优化策略、视频根底信息、画质、带宽利用率等方面进行了具体的监控。
2.2 建连优化
通过以下 4 个策略来升高建连环节的耗时:
- 在利用冷启动以及视频播放时,通过连贯复用,缩小了 DNS 解析、SSL 以及 TCP 连贯环节的耗时。
- 在视频播放过程中,用户可能因为某些起因暂停视频,比方把利用切到后盾,几分钟后再关上 利用,这种状况下可能呈现连贯被断开,当复原播放时须要从新建连,从而导致播放卡顿的问题。通过连贯保活,可确保再次播放时视频疾速下载、疾速 开播。
- 传统的 local dns 可能会呈现解析 DNS 劫持、解析迟缓等问题,通过 http dns,可有效应对 DNS 劫持以及解析迟缓的问题,为了应答复杂多变的网络环境,咱们还通过在线配置的形式,反对多种 dns 解析以及降级策略。
- 当 DNS 解析失败时,通过服务端下发的 IP 实现直连,从而晋升连贯成功率。
以上就是咱们在网络连接环节的一些优化策略,上面介绍咱们在视频下载环节的优化。
2.3 分片下载
为了实现预加载,即在视频播放之前把在线视频提前下载到本地,咱们在播放器和 CDN 间接减少了一个本地代理的服务,播放的网络申请都由本地代理服务响应,本地代理服务再向 CDN 发动申请。在弱网下测试,咱们发现 卡顿状况比较严重,次要是存在不必要的网速竞争,并且惯例单线程下载效率低于多线程并发下载。为此,咱们通过剖析协定以及屡次试验,最终确定了全新的下载方式,即首个视频起播时应用单线程,后续的视频下载以及预加载都通过多线程分片申请实现。
同时,把播放器 与本地代理之间的 socket 通信形式批改为直连,防止了 socket 中不必要的读写缓冲区节约。通过这样的调整,首帧耗时升高 3.8%,播放失败率降落 9%;并且还具备了播放过程中实时切换 cdn 的能力,即在首次开播时使用性能较好的规范 cdn,在缓存较短缺时切换为低成本的 cdn。
2.4 预渲染
通过以下优化策略晋升预渲染成果:
- 利用冷起后,首个视频的开播体验对用户的后续生产有着十分重要的影响,为了晋升该的播放体验,在利用启动时预创立 H265 以及 H264 对应的 codec 实例,在开播环节间接应用预创立的解码器,开播耗时可升高 50ms 左右。
- 播放器的创立环节波及到较多的流程,比拟耗时;另外,惯例的每次播放视频都创立一个播放器对象的形式,容易呈现因播放器对象透露导致的 OOM、ANR 甚至播放失败。基于这两个问题,咱们创立了全局复用的播放资源池,每次视频播放时都从资源池中间接获取曾经创立好的播放器对象,通过该策略,可无效的升高播放器创立耗时,并且彻底解决了播放器实例透露问题,对系统稳定性以及播放成功率都有显著的改善。
- 后面咱们介绍了预加载策略,即在视频播放之前提前下载局部数据到本地,视频播放时间接播放本地筹备好的缓存,开播速度较优化前有显著的晋升;但本地视频开播仍须要嗅探、解封装、解码这些环节,开播耗时仍存在优化空间。因而,咱们基于播放器资源池,应用另一个闲暇的播放器对象来提前完成下一个行将播放的视频的嗅探、解封装、解码过程,通过这个策略,首帧耗时可升高到 50ms 以内。
2.5 预加载策略
首先介绍的是固定大小的预加载策略:视频播放时,把后续 5 个视频增加到缓存待下载队列,每个视频应用固定的预加载大小,以后视频的缓存处于高水位时,开始下载缓存队列中视频,以后视频缓存处于低水位即有可能行将产生卡登时,进行下载缓存队列中的视频。
这个计划整体实现比较简单,但存在两个 问题:
- 预加载大小是固定的,未能与视频码率、时长关联,当视频码率、时长发生变化时,可能会呈现缓存有余或者缓存节约。
- 对于一条用户会重度生产的视频,应晋升预加载大小,从而晋升用户在播放过程中的晦涩度。
为了解决以上两个问题,咱们上线了动静预加载策略。
动静预加载就是在固定预加载的根底上,做了如下调整:
- 缓存分级,把固定预加载策略中的繁多缓存调整为 3 个不同优先级的缓存,优先级高的缓存较小,优先下载,优先级较低的缓存较大,下载优先级较低;一级缓存下载完结后开始下载二级缓存,二级缓存下载实现后再下载三级缓存。
- 缓存大小不再固定,批改为依据视频时长和预加载时长动静计算当用户疾速滑动时,个别状况下会命中一级缓存,确保视频能够顺利开播;当用户在列表中重度生产时,后续的视频将有短缺的工夫实现三级缓存的下载。
动静预加载策略上线后,首帧耗时升高了 2.3%,卡顿率升高了 19.5%,当然,这个策略也存在的显著的问题,即体验晋升了,但带宽老本也晋升了。咱们须要思考,如何在不减少老本的前提下晋升体验。
咱们来看一个示例:在一个视频列表中,有些视频用户喜爱观看,完播率较高,有些视频用户不感兴趣,会疾速滑过。
也就是说,只有深度生产的视频,才真正的须要二级和三级缓存,快滑的视频能疾速开播即可。基于这样的一个普遍性的案例,咱们联合视频的观看时长调整了预加载策略。
当初介绍的是智能预加载策略,整体流程如下:
- 首先,在云端基于视频根底特色比方码率、时长、清晰度,网络以及时段、历史行为等特色,应用深度神经网络创立、训练模型,用于预测一个视频用户会深度生产还是疾速滑过。
- 其次,模型导出、转换之后,部署在客户端,在视频开播之前预测生产深度。
- 最初,播放器仍保留之前的一级缓存,并作为最高优先级进行下载;所有的一级缓存都下载实现后,依据预测的生产深度调整二级缓存的大小,如果该条视频会重度生产,则开启二级缓存,否则放弃二级缓存。
这个计划目前还在试验中,后续咱们也将继续摸索机器学习在播放上的其余利用。
体验优化的成果须要被精确、主观的掂量,并且能精确反映用户的实在体验。
在起播环节,咱们设计了两个 P0 指标,即首帧耗时和失败率,同时,咱们也设计了若干个 p1 指标,包含缓存大小、缓存命中率、预渲染命中率,下载速度等,这些指标的稳定间接会影响到 P0 指标。
在视频播放环节,咱们设计了卡顿率、卡登时长以及 seek 卡顿等 P0 指标,同时,设计了百秒卡登时长、百秒卡顿次数、缓存利用率等 p1 指标作为对 P0 指标的补充。
基于以上指标以及视频根底信息、预加载预渲染策略信息,咱们设计并上线了分层监控零碎,自上往下共分为 4 个层级:
- P0 指标:包含开播耗时、卡顿率等,这些是咱们最为关注的外围指标
- P1 指标:作为对 P0 指标拆解和补充
- 策略指标:包含预加载开启率、命中率、预渲染开启率、命中率,这两个策略对播放体验的影响比拟显著
- 最初一层是 视频根底信息,包含码率、时长、画质分等,这些指标也会影响到外围性能指标
三、老本优化
后面介绍了咱们短视频在播放体验方面所做的一些致力,通过前述的这些优化,目前咱们短视频的播放晦涩度曾经达到行业内的一流程度。而随着业务的一直倒退,播放的老本也随之水涨船高,成为业务必须要应答解决的首要问题,接下来将和大家分享下咱们在播放老本优化方面的一些思考及实际计划。
3.1 老本拆解
首先,咱们先理解下播放老本蕴含了哪些老本。它次要是由 CDN 老本、存储老本以及进行转码压缩等所须要的计算成本组成,而这外面 CDN 老本占了总成本的 80% 左右,是最大的一个老本起源,所以,接下来咱们的分享次要是围绕如何升高 CDN 老本开展。
要晓得怎么进行 CDN 老本的升高,就须要理解哪些是影响 CDN 老本的重要因素。如下图所示:
- 第一层拆解,CDN 老本 = 单价 x 用量,这个置信大家都能很好了解。
- 第二层的拆解,失常状况下,用量 = 用户理论播放的视频时长乘以视频的码率,而后面咱们也介绍过,为了晋升视频播放的起播速度,升高播放过程中的卡顿率,咱们会对视频进行预加载及预缓冲,那这部分量可能最初用户并没有产生播放行为,也就造成了流量的节约。因而咱们引出了流量利用率的概念,在后续还会具体介绍。这里咱们须要晓得的是 CDN 理论计费的用量 = 用户播放的时长 x 码率除以流量利用率。
那当初有 4 个最根底的因素会影响老本,别离是单价、时长、码率、流量利用率,其中时长是业务谋求的增长指标,无奈用以降本,因而其余三个因素就成了咱们重点 优化的方向,它们别离是。
- 寻找计划升高单价
- 对视频码率进行极致压缩
- 对利用率进行治理晋升流量利用率
在正式介绍咱们的降本计划之前,咱们还须要先思考一个问题:老本的升高往往带来的是服务质量的升高,咱们须要如何能力在保障播放体验的同时,升高播放老本,也就是大家常常探讨的,如何做到体验与老本的非零和博弈。
3.2 单价升高
本大节将为大家介绍咱们的第一个降本方向,CDN 单价的升高。
3.2.1 引入 PCDN
咱们的第一个计划是引入单价更低的 PCDN 技术,PCDN 是目前一种新兴的内容散发网络,其次要是利用路由器、小盒子等便宜的边缘设施代替规范 CDN 的边缘节点,因为接入设施及接入网络更加便宜,故而老本绝对于规范 CDN,要低很多。
其网络架构如下图所示,APP 通过 SDK 拜访 PCDN 的边缘节点,如果内容热度值低,PCDN 节点中没有该视频的缓存,则返回 302 状态码给到客户端,客户端再去拜访规范 CDN 获取资源,当视频热度达到肯定阈值时,PCDN 会去规范 CDN 上回源获取对应的视频资源向客户端提供服务。
从这里咱们能够看到,PCDN 的节点性能相比规范 CDN 更差,而拜访时会有肯定几率进行 302 跳转,减少了链路的耗时,所以必然会对视频播放时的起播速度和卡顿率造成较大的影响。
对此,咱们制订了多个优化措施,来升高播放体验的受损状况,在老本和体验之间进行均衡。
(1)播放器策略优化
第一个优化点是通过播放缓冲水位去管制是否走 PCDN,在视频起播时应用高性能的规范 CDN 进行分片下载,而只有以后视频的缓冲数据达到阈值后,才应用 PCDN 进行下载,利用缓冲视频的时长,能够无效对消 PCDN 的链路耗时减少。
第二个优化点是,在视频起播阶段发送 1 字节的探测包到 PCDN 节点,以此来确定 PCDN 节点上是否存在对应的视频内容,不存在时则后续分片都从规范 CDN 拉取,存在的话后续再走 PCDN,这样能够大大减少 302 跳转产生的概率。
通过以上两个优化后,引入 PCDN 对咱们的播放体验已根本不会产生负面影响了。以此,咱们达到了保障播放体验的同时,升高了 CDN 老本的目标。
(2)业务策略优化
因为 PCDN 节点服务的次要是热点视频,因而咱们对热点散发的场景进行了梳理,对这些场景用到的视频提前预热到边缘节点。因为做了预热,PCDN 节点提前缓存了相干视频,呈现 302 跳转的概率进一步缩小,因而咱们能够适当升高缓冲水位的阈值,提前申请到 PCDN 节点。基于此计划,咱们做了相干的 A / B 试验,试验的后果是,咱们在保障 QoE 不变的状况下,晋升了 PCDN 的分享率,即,会有更多的流量走到 PCDN 节点上,进一步升高了 CDN 老本。
以后咱们 PCDN 分享率在 46% 左右,在探测胜利后,只有 1% 以内的流量会呈现 302 跳转,根本能够忽略不计。通过线上长期实验组的观测,卡顿率和起播耗时高低稳定,无显著负向。
以上是咱们进行单价升高的第一个计划,接入 PCDN,接下来咱们看下 另外一个计划。
3.2.2 共享闲时带宽
行业内 CDN 计费的形式有多种,包含流量计费,峰值带宽计费等,对于峰值带宽计费,是以每天的带宽最高点作为计费值的,这种计费形式,对于继续稳固的流量会更加适合。而咱们短视频是一个用户实时生产视频的利用,拜访热度会有显著的波峰和波谷,比方中午大家劳动的时候以及上班的时候会有更多的工夫去看视频,而夜里睡觉时,业务的流量则绝对较低。失常状况下咱们 CDN 的带宽波形如下图所示,能够看到闲时咱们的带宽是很低的,造成了很大的节约。
针对此种状况,咱们和公司内其余业务进行单干,引入了他们的流量进行填谷,共享了咱们的闲时带宽。能够看到填谷后,蓝色区域的比重明显增加了很多,其余业务会针对这部分流量进行老本分担,因而相当于升高了咱们的老本单价。通过上述的 PCDN 及共享闲时带宽,CDN 的单价失去了大幅的升高,从而无效节俭了 CDN 老本,是咱们进行降本的重要伎俩。
3.3 极致压缩
接下来,是咱们降本的第二个方向,对视频进行极致的压缩从而升高视频的码率。
咱们当下遇到的 问题 是:一个视频的清晰度是和码率强相干的,而为了达到雷同的清晰度,不同内容场景的视频所需的码率是不一样的。
先前,为了保障用户的播放体验,缩小低质视频的呈现,咱们设置的码率规范较高,导致很多视频没有失去无效的压缩。
在解决这些问题时,咱们面临着这样几个 艰难:
- 第一是内容库中有千万量级的视频内容,内容量十分大;
- 第二是这些视频场景非常复杂,变幻无穷;
- 第三则是这些原始视频的品质也是参差不齐的。
为了可能在这样的状况下进行老本优化,咱们须要依据视频的内容特色,自适应调整编码参数,在保障视频清晰度的前提下,对视频进行极致压缩。
接下来,来看下咱们是如何做的。
首先咱们基于神经网络,自研了一套内容自适应编码算法。算法模型的训练过程如下:首先第一步咱们会依据内容库中的场景标签,从内容库中收集足够大视频数据集作为模型的训练数据。
而后对训练集中的视频进行不同比例的压缩转码作为 Ground Truth,再对压缩后的视频提取特色,这些特色包含视频的复杂度特色、码率信息、画质特色、码流特色等;最初利用上述特色,进行神经网络拟合训练,失去视频品质与压缩率的关系模型,该模型能够预测压缩比例和视频压缩品质之间的对应关系曲线。
上图展现的是咱们模型的预测成果,红色弧线是视频在通过不同比例压缩后失去的 VMAF 曲线,是理论的 Ground Truth,而蓝色曲线则是咱们模型的预测曲线,能够看到预测曲线和 Ground Truth 十分靠近。于是,咱们便能够通过预测曲线,在保障清晰度统一的状况下,确定不同视频须要的编码参数,达到内容自适应编码的目标。
最初再来看下咱们极致压缩的 残缺流程:
- 首先第一步是对视频进行前置加强解决,这一步解决的目标是晋升原始视频的画质,从而能够对消一部分视频编码带来的伤害,另外去除噪声等进化也有利于压缩过程中升高视频的码率。
- 在通过加强修复后,须要对视频进行场景划分,一个视频可能蕴含多个场景,这些场景所须要的编码参数也不一样,通常咱们称之为 Per-title 分场景编码,更细粒度的抉择不同的编码参数对视频进行压缩。
- 第三步就是对每一个场景的视频提取视频特色,通过咱们的自适应模型决策出最佳的编码参数,进行编码合成,最初失去输入视频。
通过这几步的解决,咱们的压缩率相比之前有了大幅度的升高,通过线上的数据统计,咱们的均匀压缩率从 60% 升高到了 40%,能够看到这个优化成果非常明显,以上就是咱们极致压缩的计划,通过进一步压缩码率,升高咱们的 CDN 老本。
3.4 利用率治理
咱们的最初一个优化方向是 利用率治理。
先解释下什么是流量利用率:在播放过程中,为了晋升播放的晦涩度,须要提前去缓存以后视频以及预加载前面的视频,同时网络层也会有 socket 的 buffer,用户如果应用不到这些流量,那就会产生流量节约,这些节约的流量与用户理论播放的流量相加,就是 CDN 理论产生的流量,流量利用率就等于理论播放的流量除以 CDN 理论产生的流量。
由此可见,在整个播放链路上,都存在流量的节约,而咱们心愿通过利用率的治理,管制并缩小这些节约的产生。
3.4.1 利用率漏斗建设
咱们 须要治理的第一个问题是:在版本迭代的过程中,播放的策略也是在一直优化的,比方咱们可能为了体验着想,减少了预加载的数量,或者做了多级预加载。然而在做这些优化的时候,咱们无奈无效的掂量每个优化到底对 CDN 老本带来了多大的变动,会不会减少流量的节约。
对于这个问题,咱们的 解决方案是,针对每个版本,建设了如下图所示利用率漏斗,并退出到了灰度报告中,严格监控每个版本呈现的流量节约状况,避免播放策略优化导致 CDN 老本大幅减少。
3.4.2 利用率晋升
咱们须要 治理的第二个问题是:对于预加载或者预缓冲等策略,咱们都会设置一个下限阈值,保障体验的同时避免耗费过多流量,然而这个阈值始终都是以咱们工程师的教训设置的,无奈确切的晓得这个阈值是否正当。
针对这个问题,咱们的 治理计划是,通过前述建设的漏斗数据,针对阈值进行线上 A / B 试验,通过收集不同阈值下体验和老本的变动数据,找到投产比拐点,从而确定最优阈值。
3.4.3 治理成果
这边展现了咱们治理后的 成果。
(1)首先在治理前,如下图左侧显示,有两个突刺点,这是因为某些版本优化时,没有辨认到老本的增长量级,并且在灰度期间无奈显著看出老本的变动,及时止损,最终导致咱们的 CDN 带宽大幅增长。而 在治理后,能够看到,咱们的带宽变得安稳很多,不再呈现突刺点,带宽突增问题失去了无效。
(2)其次,如下图右侧所示,在治理前,咱们的流量利用率在 60% 左右,而在 治理后,咱们在保障体验不受损的状况下,将利用率晋升到了 70%,从而节俭了相应的 CDN 老本。
通过对流量利用率的监控和治理,咱们能够清晰的掌控播放链路中每个节点可能产生的流量及带宽状况,找到老本优化点,升高咱们的 CDN 老本。
四、总结 & 瞻望
如下图所示,能够看到咱们的优化联合了大数据、A/ B 试验、AI 技术等,通过对这些技术的利用,咱们进行了播放体验和播放老本两个方面的优化。
- 首先是对播放体验优化,咱们顺次从网络层、播放层、应用层进行了相干的策略优化,这外面次要包含分片下载、预加载 / 预渲染、分级缓存等策略。
- 其次是播放老本的优化,咱们别离从单价、码率、利用率等方向进行了降本,这外面次要包含 PCDN、极致压缩、利用率治理等计划。
这些优化计划,是咱们短视频团队长时间的实际积攒,帮忙咱们在体验和老本之间做到了双赢。
最初是咱们将来的一些瞻望,咱们会继续聚焦音视频前沿技术,在压缩编码方面,咱们会去钻研引入 H266 技术,进一步压缩视频的码率,而在加强方面,咱们会对端侧加强技术进行预研,通过端云协同加强,进一步做到降本增效。