关于音视频:vivo-短视频体验与成本优化实践
作者:来自 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跳转,减少了链路的耗时,所以必然会对视频播放时的起播速度和卡顿率造成较大的影响。 对此,咱们制订了多个优化措施,来升高播放体验的受损状况,在老本和体验之间进行均衡。 ...