前言:最近公司的篮球馆模块优化提上日程,因为篮球馆录制视频的的特殊性,目前输出的视频有两种形式,一种是1080,一种是4k,现在主要优化的是1080的情况下,目前这种情况下每个视频都是8G左右的大小,时长基本上都在6个小时左右,周末的话是9个小时,包大小一般在8G 到15G
一、视频加载速度优化
注意:视频的清晰度是由码率和分辨率决定的,分辨率和码率是相辅相成的,码率越高,分辨率就会越大,包体积越大,也就越清晰,目前这种方式在1080p 几千码率的情况下是适用的,4k高清 几万码率的情况下 暂不适用。正在寻找优化方案
以往版本:
前几个版本我们采用的是mp4+AVPlayer播放器的方式,这种方式的缺点很明显,缓冲比较慢 动则加载一两分钟才开始播放
优化历程 :
在此先说说市面上几种优化解决方案
1.七牛(或者其他平台)云存储+CDN服务
2.mp4+本地Server边下边播
3.m3u8+本地server边下边播
1.第一种方案,是利用CDN的多个节点,给与客户端最大带宽的方式,让用户的网速发挥到极致,一般是按照流量收费,这个各大平台都可以看得到,具体优缺点平台文档一般都挺详细的。不符合公司目前要求,过滤
2.第二种方案,利用KTVHttpCache搭建本地代理,AVPlayer向本地代理服务器发送请求,代理服务器接收到请求后,向存储服务器发起请求,获取到数据后,存放到本地一份,传输给AVplayer一份,这种方式必须得整个视频缓存完毕,下次播放时优先从本地获取,如果本地不存在再从存储服务器获取,对于首次打开时并没有任何优化,但是如果第一次缓存完整,第二次打开时因为是从本地加载,对于体验会好很多,对于要求不高的,这种方式足矣
3.第三种方案,利用m3u8的切片特性,录制视频的时候讲视频切为2秒一个的ts文件,m3u8文档记录每个视频文件的索引
利用SJMediaCacheServer进行代理服务,没有采用KTVHttpCache 的原因是,不知道为什么m3u8在KTVHttpCache上无法正常缓存,在开启代理的同时将切片保存到本地,因为切片的特性,首开的时候只需要解析到m3u8加载2秒的一个切片即可开始播放,大大提升了用户的首开体验,SJMediaCacheServer对切片的缓存可以让用户在第二次打开的时候无论是否首次缓存是否完整都可以从本地获取视频开头的切片进行播放,这种方案对于用户首开和二次加载的体验,都有大大的提升,同时这种方案还可以对以后的剪辑操作有很大利好
二、视频剪辑优化
以往版本:
剪辑的时候是先传输给服务器需要剪辑哪一段,生成这一段的视频后再进行下载,下载完成才可以进行本地剪辑操作,从传给服务器需要哪一段视频到服务器生成这段视频链接这里耗费时间太长
优化历程:
1.从本地沙盒获取缓存的ts文件通过FFmpeg转码成mp4进行剪辑操作
2.正在摸索
1.第一种方案,利用了SJMediaCacheServer缓存在本地沙盒的切片,通过两秒一个切片,计算出需要哪些切片来进行合并,合并成一个总的ts文件,再通过FFmpeg转码成mp4进行编辑,经过测试这个方案相比较以前体验提升不大,主要耗时在FFmpeg过程,在7plus上转码速度较慢,FFmpeg集成有些不友好,可以从下边第一个文档链接中直接把作者集成好的FFmpeg拖到自己的项目里使用,集成和解决错误可以参考下边的文档
参考链接:
《iOS集成FFmpeg及视频格式转码》
《iOS 分享一个边播边缓存的库(支持FILE和HLS)》
《iOS 视频缓存KTVHTTPCache原理和实现》
《抖音iOS端落地720P视频实时超分技术,可显著提升视频画质》
《从350ms到80ms,揭秘阿里工程师 iOS 短视频优化方案》