本文阐述了网易新闻客户端在段视频性能方面的优化思路、过程及结果,做到了小投入高产出
本文作者:Re
前言
在过去的2018年,短视频开始占据互联网越来越多的流量。爆红的短视频社交应用自不必说,通过短视频来获取新闻资讯、观看音乐专辑、甚至在电商平台观看商品介绍也已经成为越来越多用户的选择。
网易新闻客户端作为一个资讯类产品,也在逐渐增加视频形式的内容来满足用户的需求。而随着视频的内容的增加,视频体验也变得越来越重要。如果视频的观看给用户造成了困扰,那么就会增加流失用户的风险。
为此我们在过去的一年中对视频的性能进行了持续的优化,虽然期间遇到过很多困难,但也因此收获了宝贵的经验。我们希望将这个过程中的经验和思考分享出来,一方面是作为一个阶段性的总结,另一方面也希望能对大家有所帮助和启发。
在这篇文章中,我们将围绕以下几点来分享我们的经验与思考
-
如何明确优化的方向与重点
-
客户端上有哪些提升性能的手段
-
如何结合具体情况进行技术选型
-
客户端外我们做了哪些优化
-
数据导向的重要性及对我们的帮助
明确方向
短视频作为网易新闻中的一个功能,是重点但不是全部。在优化上我们没有不停试错的成本,所以抓住重点与方向很重要,这样才能在有限的成本中达到最好的效果,一旦跑偏那么会浪费大量的时间和人力。
流程分析
系统地了解视频的播放流程是有助于我们把握方向的,站在一个全局的角度对视频播放进行分析也更容易发现其中的问题。所以我们先将需要优化的过程拆解成几个独立的过程,分析这些过程各自的特点,然后结合我们的目标和条件去进行选择性的优化。
生产流程
在了解视频的播放流程前,我们可以先看看视频是如何生成的。
-
数字化
曾经广泛流行的模拟摄像机输出的是模拟信号,因为计算机只能处理0和1,所以需要将模拟信号转换为数字信号,这个过程就叫做数字化。虽然现在数字摄像机和手机已经成为主流,可以直接输出数字信号,但是这些设备内部的光感元件本质上输出的还是模拟信号,所以这个过程还是存在的,只是绝大多数情况下我们不需要去关心它。
-
编码
原始数字视频的数据量是相当大的。如果不进行压缩,通过现有的网络传输能力是难以流畅的在线播放的,即使是存储也会变得非常不便。所以我们需要通过压缩来高效的存储数字视频的数据,这个过程就叫做编码。经常看到的 H264(AVC)、H265(HEVC)就是常见的视频编码,AAC 则是一种常见的音频编码。
-
封装
我们通常意义上的“视频”,其实包含了视频数据和音频数据,有时还会包含多音轨或者字幕。所以我们需要一个容器能够将视频和音频等数据打包传输存储,并且能够保证它们在时间上的同步。将以上这些元素打包进一个容器中的过程就叫做封装,而我们经常提到的 MP4、MKV、TS 等等这些其实都是一种封装格式。
-
协议
这里的流媒体协议指的是 HLS 、DASH 这些基于 HTTP 的动态自适应协议。在直播风头过去后,这些流媒体协议仍然活跃在很多点播场景中。并不是所有的视频都需要并且可以通过流媒体协议来下发,但是这些流媒体协议的动态自适应等特点在一些场景下可以帮助我们获得更大的优化空间。
播放流程
在了解了视频的生产流程后,再看播放流程就相对简单了。如果说视频的生产是将数据一步步封装组合的话,那么视频的播放就是将数据一步步拆解还原。
我们将客户端获取视频数据的过程也加进来,那么一个视频在手机上播放会经历以下这些步骤。
-
读取
获取视频的数据,数据的来源可以是网络、磁盘或者内存。
-
缓冲
一般情况下,读取的速度是大于播放器消费的速度的,我们可以将已经读取但播放器尚未消费的数据存储在内存中,这样当 I/O 速度有所波动时可以一定程度上避免对观看体验的影响。这个过程就叫做缓冲。
-
解协议
如果我们读取的是流媒体协议,比如 HLS、DASH 这种,那么我们还需要进行解协议的操作。按照索引文件的规则去读取相应的视频文件,但如果我们读取的已经是 MP4 这种容器文件的话,那么就不存在这一步了。
-
解封装
视频、音频等数据都封装在了容器文件中,因此要想解析视频和音频就需要将它们从封装容器中提取出来。按照封装格式的规则进行数据提取的过程可以称作解封装。
-
解码
在解封装后我们拿到了视频和音频的编码数据,接下来需要将它们解码还原成视频和音频的原始数据。
-
渲染
最后我们就可以将视频和音频进行输出从而进行观看了。
在了解了基本的播放流程后,就需要结合目标进行具体分析,看看在这个播放的流程中哪些过程是值得我们重点关注的。
目标分析
在网易新闻客户端上我们是以秒开率、卡顿率、失败率三个指标来衡量性能。
秒开率
秒开率的优化重点和首屏平均时间是不一样的。秒开率不仅仅要求的是速度,也衡量着播放器的稳定性。
当整体水平提升到一定阶段后,首屏平均时间关注的仍然是中坚用户,因为他们的占比最大,优化的效果对于均值的提升最明显;但秒开率更需要关注的是那些性能较差的用户,因为只有这部分的用户性能提升了,秒开率才能提高。
所以对于秒开率来说,“读取”阶段最为关键。数据默认情况下都是从网络读取,而网络的时间是非常不可控的。恶劣的网络环境下加载时间很容易就会超过1秒,因此这里有着很大的优化空间。
卡顿率