App上传大视频的一种解决方案
去年年底闲来无事,在猪八戒网上闲逛,看能否赚点零花钱。哈~。
看到一需求:相册读取大视频文件(上G),文件流读取,分片上传,禁止占用本地磁盘。
最初想到读取视频文件用 UIImagePickerController,文件流上传采用NSInputStream和 NSOutputStream去解决。网上查找也有不少对应的资料和demo。后来与老板沟通后,要求是上传到七牛类似的云端,文件流上传也不符合分片上传的要求。最重要的一点视频文件很大,直接读取到App就会崩溃。
另外一种读取相册的方式是ALAsset,iOS 8以后苹果推荐使用PhotoKit。而且最让人激动的是,通过 PhotoKit可以获取到视频文件的路径。七牛云提供的分片上传接口中,参数必须是路径。哈~~接下来就是做个demo去验证啦。
获取所有相册资源,并按照创建时间排序。
let fetchOpt = PHFetchOptions()
fetchOpt.sortDescriptors = [NSSortDescriptor.init(key: "creationDate", ascending: true)]
获取所有视频集合。
let videosAsset = PHAsset.fetchAssets(with: PHAssetMediaType.video, options: fetchOpt)
获取视频文件路径。
集成七牛云存储第三方,基本实现需求。
我在测试时,PhotoKit获取视频文件的方式是不可视的,很难选择自己想要上传的文件。而UIImagePickerController可以选择对应的视频。想要做一个类似相册的VideoPicker,就要获取视频的第一帧,并把它显示出来。
在加上视频时间,就像个VideoPicker的样子啦。
这种VideoPicker的方式与系统相册的方式对比。ThumbVideoPicker占用内存小。我用一个20M左右的视频文件测试。结果如下:
系统UIImagePickerController方式 ThumbVideoPicker方式在打开到对应视频缩略图页面时,系统内存达到第一个峰值,约16M左右。而本文所用ThumbVideoPicker只有13M左右。另外系统在选择对应视频后有一个压缩的过程,也会占用不少内存。在视频文件很大时,这种优势更为明显。
如果是仅为获取视频文件路径上传,或者大文件视频上传(无压缩),采用PhotoKit的方式也是一个较好的选择。
附: