美文网首页iOSiOS移动开发社区DXSmile的收藏夹
App上传大视频的一种解决方案

App上传大视频的一种解决方案

作者: 浮萍儿 | 来源:发表于2017-02-04 15:07 被阅读1934次

    去年年底闲来无事,在猪八戒网上闲逛,看能否赚点零花钱。哈~。

    看到一需求:相册读取大视频文件(上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的方式也是一个较好的选择。

    本文参考demo

    附:

    NSInputStream 相册上传资料

    PhotoKit学习资料

    Example app using Photos framework

    相关文章

      网友评论

      • helloDolin:上传视频,这样拿filePath,七牛提示没有访问权限,怎么处理?
        helloDolin:@浮萍儿 获取了哇,你通过asset拿路径,调用七牛putWhitFliePath的api是走不通的,苹果不允许的,需要自己拷贝到自己应用沙盒中,才行,七牛提供的另一个api putAsset就是转为data存到本地沙盒,再上传的,已亲测
        浮萍儿:@helloDolin 你获取到相册权限了么?
      • 浮萍儿:@niuxinghua 看七牛官方文档和demo,有详细的说明。我只是实现了最简单的上传功能
      • niuxinghua:分片上传设计了续传的功能吗
      • 025c838455c0:大神!!!!写的极其详细,刚好解决了我的需求。

      本文标题:App上传大视频的一种解决方案

      本文链接:https://www.haomeiwen.com/subject/yypjittx.html