自动选用速度快的CDN播放MV in iOS

为什么要做这件事

最近云音乐用户数量要上亿了,用户量增加的过程中总有许许多多以前没暴露的问题。
比如最近好多人反馈MV经常卡顿。从反馈情况看是某个区域的用户访问我们CDN的速度比较慢。
但是如果只是换CDN服务提供商的话,就算这个区域的用户连接速度康复了,也很容易造成另一个区域的用户访问CDN变慢的情况。挑选新的CDN提供商也是个麻烦事。
不管怎样,先不考虑换CDN的事情,客户端层面的访问速度优化还是有必要做的。
既然不把更换CDN的因素考虑在内,一个特定用户的终端连接到每个CDN节点的速度是硬生生摆在那的。
所以要提升访问速度有两个事情可以做:

  1. 降低视频文件尺寸
  2. 选取最快的CDN节点

如何降低视频文件尺寸

降视频文件尺寸无非就两点:

1. 使用更低的分辨率

容易被用户喷视频不清晰,现在云音乐最低设置了240p的解析度选项,再低就是AV画质了。

2. 使用更高压缩比的格式,比如H.265

说实话这个开发成本有点大。原因如下:

  1. 曲库要把线上全部MV做一遍到H.265的转码,不知道要花多长时间。
  2. iOS端播放H.265,解码器和渲染要自己嵌入,不能用系统的播放器了,就算有相应开源lib也是个大工程;况且iOS中系统内嵌的播放器已经为移动播放做了不少优化,就算过了解码和渲染这一关,还是有很多优化的工作需要做的。工作量是很大的。
  3. 根据官方文档,H.265相比正在使用的H.264格式,数据尺寸下降了25%左右。这么一个大工程换来预期25%的速度提升性价比不高。

经过以上考虑,视频文件尺寸优化先不做了。

客户端选取最快的CDN节点

这个feature准备做在下个版本的客户端里。所以以下分析目前还纯属意淫。
客户端选取最快的CDN节点无非也是就两点:

  1. 测速,找出最快的CDN节点是哪个
  2. 切换至最快的CDN节点播放

测速

  1. ping服务器看哪家快。这件事不能常做,顶多网络变化时做一次,并缓存蜂窝网下的ping结果(一般使用软件时更换手机卡并不多见)。
  2. 通过观察系统播放器等待载入时间判断是否需要切换服务器。这个还是有必要做的,因为用户在Wifi和蜂窝网下切换时,很可能Wifi访问节点1快,蜂窝网访问节点2快。

有缝切换

方案是直接把系统播放器的URL换掉。推测对用户体验的影响可能有以下两点:

  1. MV重新显示载入菊花。但是考虑到切换时,上一个CDN节点无法满足播放需要才会更换,往往是正在显示着载入菊花,所以”重新”显示载入菊花实际上对用户体验不大,毕竟不会让用户知道页面里播放的MV地址已经换掉了。
  2. 视频可能短暂黑屏,并会往前跳一点时间,至上一个关键帧开始播放。

好处就是开发成本相对无缝切换要小不少。

无缝切换

方案是直接通过NSURLProtocol将数据下载从慢CDN改到快CDN。好处如下:

  1. 对于上层接口来说,这个改动是无需关心的,也就不用关心业务逻辑。
  2. 不会出现直接替换播放URL那样的视频短暂黑屏,往前跳转的现象,用户体验较好。

现在看到的风险点如下:

  1. 可能需要处理MV缓存。而MV缓存很可能占用很大空间,写一个MV视频碎片的缓存逻辑可能不是易事。
  2. 需要CDN域名或视频URL有一个现有规则好让NSURLProtocol匹配替换。
  3. 比仅仅在播放器中更换URL开发成本增加。

然后就是团队讨论那种切换方案更适合了。
至于具体实现,并非难事,并没有把具体实现补充到本页的打算。

Over

Comments