欢迎你们前往腾讯云社区,获取更多腾讯海量技术实践干货哦~缓存
做者:芦艺,QQ空间开发团队一员性能优化
Qzone的日均视频播放量已经突破了10亿,其中Android端的播放量在总播放量中的占比超过70%,相比年初,播放量的增加了超过10倍。视频下载是整个视频播放的基础,若是下载侧出问题,则会形成整个视频播放的失败,这就对咱们的视频下载提出了很是高的要求。服务器
基于此,咱们将视频下载总结为"多快好省"四个方面,如下载成功率、首次缓冲时长和缓冲几率为主要的技术指标对视频下载进行优化。具体参数的优化结果见下表1,通过长时间的打磨,咱们的视频下载模块的下载成功率已经达到了99.9%,视频的首次缓冲时长1.2秒,二次缓冲几率低于1%,取得了良好的效果。下面我将从"多快好省"这四个方面,对咱们主要的优化工做进行论述。网络
表1: 下载相关技术指标优化先后对比less
技术指标 | 下载成功率 | 首次缓冲时长 | 缓冲几率 |
---|---|---|---|
优化前 | 97.1% | 2s | 15% |
优化后 | 99.9% | 1.2s | 0.9% |
在10亿这个量级下,除了保证下载的成功率和下载速度这些主要参数以外,对于整个下载流程的监控、处理异常状况显得格外重要。为了提高视频的下载成功率、稳定性,监控整个下载流程,提高用户体验,咱们采用本地代理的方式进行视频下载。工具
在Android手机上播放在线视频,最简单的方式就是实例化一个MediaPlayer, 将视频的URL经过setDataSource()设置给播放器,以后调用prepareAsync()和start()遍能够开始播放视频。这种方式很是简单,但其中最大的问题就是整个过程当中的数据流彻底由MediaPlayer控制,咱们没法控制下载和播放的过程,也就致使咱们没有办法提升成功率,优化用户体验。所以,Android侧的视频下载通常采用本地代理的方案实现。本地代理的方案便是指在播放视频的时候,将视频的URL转换为本地URL(127.0.0.1开头),在播放器经过本地URL请求视频数据时,本地代理截获此次请求,在通过本地的处理逻辑后,向服务器或者本地缓存请求数据。本地代理在得到视频数据以后,将数据转发给播放器,具体的流程以下图1所示:性能
图1:本地代理数据流测试
相比起直接由播放器请求数据,本地代理的优点是数据流由本地代理控制,咱们能够在本地代理中加入缓存、预加载、防盗链等业务逻辑,这能够极大的提高视频下载的成功率,减小视频的缓冲时间,从而提高用户体验。优化
传统的本地代理方案确实解决了播放器直连带来的问题,但一样也会产生一些问题,视频下载和播放的业务逻辑复杂,过多的逻辑和下载自己耦合,给开发的过程带来极大的不便,而且这样也不容易接入第三方的下载器和对下载过程进行监控。所以,在经历了两个版本的迭代以后,咱们将整个下载过程进行重构。此次重构使得下载各模块的职责明确,便于开发、维护以及接入第三方的下载,也为咱们后续的优化打下基础,重构以后的方案会在以后单独成文介绍。编码
国外SmartBear的研究代表,57%的用户在3秒没有加载完网页时就会放弃。在视频播放上,加快视频的加载速度,减小播放过程当中的卡顿,对提升用户观看视频的体验有极大的帮助。通过咱们长期的优化,如今Qzone视频播放的接近秒开,缓冲几率降低到不到1%,这极大的提高了用户体验,也从侧面提高了咱们的视频播放量。
在这数据提高的背后,咱们主要作了几个方面的工做:
盗链播放在国内很是广泛,而盗链会使平台资源流失,增长带宽成本,不利于平台的长期发展,国内大部分视频服务提供商都在必定程度上作了防盗链。防盗链的主要过程是后台下发的视频URL,在正式播放以前,须要经过URL中的部分参数,加上一些本地参数,向后台拉取真正播放的URL, 这些真正播放的URL都带有时效性,这种方式能够从必定程度上避免盗链行为。但经过防盗连接口拉取真实的播放URL须要时间,这也在必定程度上延长了用户感知的视频加载时间。针对这种状况,咱们对防盗链的模块进行了改造,引入预拉取机制,将防盗链的拉取与播放解耦,对用户的播放行为进行预判,在用户播放视频的过程当中提早拉取并缓存以后视频的URL, 从而减小了由于拉取防盗链URL形成的视频缓冲时间。
图2: 防盗链预拉取
从MediapPlayer的源码能够发现(AwesomePlayer.cpp), MediaPlayer须要下载5秒的数据才会开始播放视频,按照如今的外网平局下载速度计算,该过程的耗时在接近1秒,所以对于数据进行预加载是减小视频首次缓冲很是重要的方法。但视频数据的预加载不能跟当前播放的视频抢下载带宽,所以咱们选择以当前播放视频的播放进度和数据缓存量为维度,当二者同时达到一个阀值时开始下载下一个视频的数据。在实践的过程当中,咱们还发现,由于一些编码格式的缘由,MediaPlayer在播放视频以前可能会请求一部分尾部数据,所以,视频预加载还会加载一部分尾部数据,最大限度的保证预加载的效果。
MediaPlayer加载本地视频的效率远高于在线下载,所以,缓存的命中率会直接影响到视频缓冲的速度。最初的缓存方案是针对单个视频按照顺序缓存,这样实现简单,但存在的问题就是没法对于播放空洞(非顺序播放场景,例如拖动、续播等)进行缓存,这下降了视频的缓存率和缓存命中率,增长了带宽成本和视频的缓冲时长。以后咱们针对缓存模块进行了改造,将顺序缓存改成分片缓存,即将单个视频的缓存按照必定大小进行分片,在遇到数据空洞或者缓存数据量达咱们设置的单片缓存上限时,开启下一个分片缓存,确保能够缓存全部的下载数据。这样改造以后极大的提高了缓存命中率,下降了首次缓冲时间和二次缓冲的几率。
图3: 缓存改造
梳理下载和播放过程当中总体的流程,经过工具排查流程中长耗时的点和优化过程当中的逻辑,减小没必要要的耗时和操做,并将部分耗时逻辑移入子线程;优化时序,将例如图片加载、缓存IO等重逻辑执行的时机后移,以及对视频播放关联度不高的逻辑使用懒加载。这样能够下降对于视频播放,特别是视频缓冲过程当中,CPU和IO的占用,使得系统可以调度更多的资源在解封装、解码、渲染等与播放、下载直接相关的操做上,进而减小这部分的耗时。
下载的成功率是保证视频观看体验的基础,目前Qzone的视频下载成功率已经提高至99.9%,跟主要命令字的成功率至关。国内的移动网络环境错综复杂,不只要处理断网、慢速、抖动等网络自己的题,还要处理跨网、运营商劫持等国情问题。下载成功率的提高过程很是艰难,咱们在其中主要作了如下的工做:
经过IP直出减小了DNS劫持的可能性;对于下层代理的视频下载下发多组IP,经过竞速计算本地最佳IP,使用最佳IP进行直出下载;上层代理对于下层代理的整个下载过程进行监控,在监测到下载速度缓慢或者异常状况时(IP链接失败、数据读取超时等)当即切换下载IP,减小用户的视频加载时间。经过IP直出、竞速和切换,提升了下载的链接、数据读取成功率,减小了因DNS劫持致使下载失败的几率,同时提升了下载速度。
上文(2.1章节)中提到Qzone视频播放的连接均是通过防盗链处理,带有播放效期的连接,这就使得,在实际播放的场景中,极可能出现用户但愿播放某视频时,跟随后台下发的视频连接已通过期失效的状况,若是不进行处理,则会极大下降下载的成功率。针对这种状况,咱们根据视频的不一样来源,对于每种状况进行异化处理,经过向后台从新拉取连接或者本地计算Key,解决了因链接中的Key失效致使视频没法播放的问题。
Qzone很早就开始采用维纳斯(WNS, Wireless Network Service)私有通道方案进行网络数据传输,相比使用最多的Http方案,WNS经过长链接、IP直出、接入点优化、数据压缩等方法,提升了网络链接的成功率和稳定性。为了提升主要命令字的拉取成功率,咱们对原有用Http拉取命令字的方式进行改造,使用WNS通道包裹原来的Http数据包,在后台经过WNS通道收到原有的请求后再将请求分发至对应的后台,具体的流程以下图4所示。这样经过低成本的改造(不须要修改原有协议,后台直接透传基本没有开发工做量),借由WNS提高了整个通道的传输质量,进而也提升了视频的下载成功率。
图4:下载命令字拉取接入私有通道
在移动网络下,发生网络抖动和网络切换常常发生,但网络不稳定,对下载来讲是很是致命的。为了应对网络抖动和网络切换,下层代理会监听当前的网络变化,监控当前的下载速度。下层代理在下载数据时,为了减小对于别的业务影响,不会占用所有的带宽,但当发生频繁的网络切换时,下载代理会主动突破速度的限制,尽量快的在网络状况良好时下载数据,给以后的播放留下足够的数据Buffer,保证总体播放的流畅性。
互联网的视频服务提供商在国内盈利极其困难,除了近几年视频市场竞争愈来愈激烈,版权费居高不下以外,国内高昂的带宽成本也是重要缘由。所以,如何在保证视频质量的前提下,尽量减小下载流量,减小下载而产生的带宽成本,对于咱们来讲也是很是重要的工做。在这部分,咱们主要的工做以下:
为了保证用户观看的流畅性,减小视频缓冲,视频数据下载的可播放量与当前观看的时间点以前会保持必定的Buffer,在整个播放过程当中,经过动态调节下载速度,这个Buffer的大小基本保持不变,而且Buffer的大小能够动态调节。在流量高峰的时间段,咱们会经过后台进行流量控制,减小Buffer,也就减小了高峰时段总体的下载量。带宽的计费标准通常按照高峰流量计费,减小了高峰时段的流量,也就下降了带宽成本。具体流控以下图,高峰时段视频缓冲M秒,非高峰时段缓冲N秒,N>M,两个参数都可由后台控制。
图5:流量控制
H265是新一代视频编码标准,相比原有使用H264编码的视频,具备更高的压缩比,在画质近似的前提下,H265编码的视频文件体积只有H264的一半甚至更少,所以,播放H265编码的视频能极大减小带宽消耗。但H265现阶段主要存在的问题是终端编码耗时过长,后台编码过于消耗资源,以及在Android手机上,软解码(Android支持H265硬解码的机型较少,而且硬解码的兼容性问题相比软解更多)带来的耗电、发热以及兼容性问题。目前,Qzone经过自解码播放器,在通过大量的兼容性测试以后,已经在超过100款主流Android手机上实现了H265视频的软解播放。空间视频H265和H264编码的下载带宽对比以及以后的预期状况以下图6所示,能够明显看出,经过H265编码极大的下降了咱们的视频下载带宽成本。
图6:空间视频H265和H264编码下载带宽比较
另外在2.3中论述对于视频缓存的分片改造,同时提高了下载数据缓存的使用率和命中率,也了减小了咱们的视频下载带宽。
通过长时间的优化,Qzone视频业务,包括下载成功率、播放成功率、缓冲几率、首次缓冲时长等在内的主要技术指标,均获得了大幅度的提高,达到了咱们的预期,也为Qzone视频点播和直播业务的持续发力铺平了道路。但技术优化是一个长期的过程,目前Qzone的视频播放已经开始启用自解码播放器,逐步替换原生的MediaPlayer,以后咱们还会经过播放器多实例,编解码,参数调节等方式进一步提高视频下载成功率,压缩视频缓冲时间,减小缓冲几率。也欢迎各位多使用Qzone体验咱们在各个场景中的视频播放,若是对体验或者技术优化的建议和意见,欢迎交流。
Qzone Android视频点播技术优化小分队:joltwang, michalliu, erainzhong, zakiwang,magilu.
同时感谢腾讯视频hualiangyan的长期支持。
周杰伦读心术背后的技术实现
十亿级视频播放技术优化揭密
HLS 视频点播初探
此文已由做者受权腾讯云技术社区发布,转载请注明原文出处
原文连接:https://cloud.tencent.com/com...