2017年是短视频应用火爆的一年,在短视频应用中,必然会遇到的一个问题就是用户在反复观看同一个视频的时候,如何减少网络流量的使用。
如果用户第一次完整观看了视频,其实整个视频的内容已经进行了一次下载,如果重复观看需要重复下载的话,会导致流量成倍的上升。
在第一次观看时,能否把视频数据进行cache?大致有两种方式:
- 保存在内存中,解码播放的数据不释放,无论是重复观看还是往回seek,都可以快速提供数据;
- 解码播放后的内存数据cache到硬盘,然后释放掉内存数据。下次播放时,从本地读取,命中则不发起网络请求。
相比而言,内存cache实现难度最低,但是内存开销问题显著。金山云多媒体SDK采用了第二种方案。
1. httpcache的作用
一般的视频播放流程为由播放器直接向视频服务器发起数据请求,然后服务器源源不断的想播放器发送数据供播放器持续播放直到播放结束,当再一次播放时需要重复这一过程,从而每次播放都会产生网络流量。
而如果加入了httpcache后的结构如上图所示,httpcache位于播放器和网络资源之间,作为一个http代理,一方面从视频服务器上获取视频数据,另一方面将视频数据交给播放器进行播放,如果不考虑本地缓存的问题的话,它就是完成了一个数据透传的功能。
此时的播放流程变为:
- 播放器向cache模块发起请求;
- cache模块向视频服务器发起请求;
- 视频服务器将数据发给cache模块;
- cache模块将数据发送给播放器;
此处视频数据不再是直接由视频服务器到播放器,而是中间经过了一个cache模块的中转,这样我们就可以在cache模块中对数据进行操作,无论是保存到本地还是直接转发,都可以在这个模块中进行。
而对于播放器来说,它访问的已经由原来的视频服务器变为cache模块,只要在它需要数据时,cache模块能够迅速完整的提供相应的数据就可以了,而不再需要关心数据从而来。
2. http代理的实现
http代理即作为一个http服务端,又作为一个http客户端。对于播放器来说,它是http服务端,为播放器提供http服务。另一方面,它又要作为http客户端从远端视频服务器上获取实际数据。
为实现http代理的功能,就需要将播放器原来要访问的URL进行改造,使其访问本地的http代理服务,然后http代理服务又能从URL中解析出实际要访问的地址。
最简单也最直观的方式的就是在原来URL前加入本地http代理服务的地址,如原始URL为
http://ks3-cn-beijing.ksyun.com/mobile/test.mp4
当使用http代理的方式访问时,将其改变为
http://127.0.0.1:8123/http://ks3-cn-beijing.ksyun.com/mobile/test.mp4
在原来的URL前加入了http://127.0.0.1:8123/
,表示使用http的方式访问本机的8123端口,请求参数为原来的URL。
多媒体SDK实际提供了一个查询方法:
-(NSString*)getProxyUrl:(NSString*)url
该方法输入为原始URL,返回通过代理访问时应该使用的URL。
3. 本地缓存文件的管理
对于视频服务器来说,视频文件就是一个单独的文件,当有播放器要播放时,只需要遵循http协议,播放器请求该文件的哪部分内容,就将其发送出去即可。
而对于cache模块,并不能简单的将转发的内容直接存储到本地就行的,需要考虑以下几个方面:
需要将缓存文件和实际url进行关联;
直接使用url对缓冲文件命名即可,可能需要考虑的是部分url可能会带有http查询参数,不同的参数对应的其实也是同一个文件,这时候需要考虑是否可以忽略这些参数。播放器可能只播放一部分就退出了,在播放过程中会有手动改变播放进度的情况,这样都会导致缓存的文件不完整;
所以需要另外一个索引文件来记录当前缓存文件的状态,需要记录缓存文件的总大小、已经缓存的数据位置和大小。在重复播放缓存不完整的视频时cache模块的处理;
需要根据播放器的http请求的Range字段,判断该部分数据是否已经缓存到本地,已缓存的部分从本地读取,未缓存的部分需要向远端服务器请求数据,转发给播放器,并缓存到本地,更新索引信息。缓存文件的管理;
包括已缓存文件查询和删除,缓存进度的查询,缓存文件总大小的管理(防止超出可存储大小)等。
5. 其他需要考虑的问题
- 错误处理;
- 播放器所支持的一些网络相关设置,http代理也应该支持;
- iOS应用在长时间处于非活动状态(如切后台或锁屏)时,本地http服务会失效,如何将其重启;
也欢迎大家使用我们的直播、短视频SDK。金山云SDK仓库地址:
https://github.com/ksvc
金山云SDK相关的QQ交流群:
- 视频云技术交流群:574179720
- 视频云Android技术交流:6200036233