swift4 从相册中获取视频数组

简介: 注意访问权限/// 从相册中获取视频数组----**- private func getVideosFromAlbum(result: @escaping (([ContestChooseVideo.

注意访问权限

/// 从相册中获取视频数组----**-
    private func getVideosFromAlbum(result: @escaping (([ContestChooseVideo.Video]) -> Void)){
        var videos: [ContestChooseVideo.Video] = []
        // 获取所有资源的集合,并按资源的创建时间排序如果不写就是乱序,并不好使
//        let options = PHFetchOptions()
//        options.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: true)]
        
        let option = PHVideoRequestOptions()
        option.version = .current
        option.deliveryMode = .automatic
        option.isNetworkAccessAllowed = true
        
        let manager = PHImageManager.default()
        let assets: PHFetchResult = PHAsset.fetchAssets(with: .video, options: nil)
        
        var tempCount = assets.count

        // 获取视频
        for i in 0..<assets.count {
            
            let asset = assets.object(at: i)
            manager.requestAVAsset(forVideo: asset, options: option) { (avasset, audioMix, array) in
                // 为了防止多次回调
                tempCount = tempCount - 1
                
                guard let urlAsset: AVURLAsset = avasset as? AVURLAsset else {
                    if tempCount == 0 {
                       showFailure("获取视频失败")
                       result([])
                    }
                    
                    return
                }
            
                var model = ContestChooseVideo.Video()
                model.asset = asset
                model.avSet = avasset
                model.videoUrl = urlAsset.url
                model.image = UIImage.thumbnailImageForVideo(videoURL: urlAsset.url, time: 0.5)
                model.duration = CMTimeGetSeconds(urlAsset.duration)
                model.creationDate = asset.creationDate
                videos.append(model)
                
                if tempCount == 0 {
                    // 把视频按照日期排序
                    let newVideos = videos.sorted(by: { (video1, video2) -> Bool in
                        guard let date1 = video1.creationDate,
                            let date2 = video2.creationDate else {
                            return true
                        }
                        return date1 < date2
                        })
                    result(newVideos)
                }
                
            }
        }
    }

model:

enum ContestChooseVideo { }

extension ContestChooseVideo {
    struct Video {
        var image: UIImage?             // 视频封面
        var duration: Double?           // 视频时长
        var asset: PHAsset?             // 操作信息的对象
        var videoUrl: URL?              // 视频本地地址
        var avSet: AVAsset?             // 剪辑控制
        var creationDate: Date?         // 视频创建时间
    }
}

目录
相关文章
|
6月前
|
存储 安全 Swift
在Swift中,数组(Array)
在Swift中,数组(Array)
60 3
|
Swift 索引
18 在Swift中创建一个数组
在Swift中创建一个数组
341 0
|
22天前
|
存储 Swift iOS开发
Swift 数组
10月更文挑战第27天
23 3
|
6月前
|
存储 安全 Swift
【Swift开发专栏】Swift中的集合类型:数组、字典与集合
【4月更文挑战第30天】本文探讨Swift的三种内置集合类型:数组、字典和集合。数组是有序元素集合,支持动态大小调整和类型安全;字典是无序键值对,适用于快速查找;集合是无序不重复元素集合,适合检查元素存在性和集合运算。理解这些特性和用法能提升Swift编程效率。
69 1
|
6月前
|
Swift 索引
在Swift中,要删除数组中特定索引位置的元素
在Swift中,要删除数组中特定索引位置的元素
113 3
|
6月前
|
存储 安全 Swift
在Swift编程语言中,数组(Array)
在Swift编程语言中,数组(Array)
73 3
|
6月前
|
存储 安全 Swift
在Swift编程语言中,数组
在Swift编程语言中,数组
59 2
|
6月前
|
存储 Swift
在Swift中,数组(Arrays)和字典
在Swift中,数组(Arrays)和字典
58 1
|
Swift
Swift - 用装有控制器name的数组for循环批量创建控制器(string转UIViewController)
Swift - 用装有控制器name的数组for循环批量创建控制器(string转UIViewController)
102 0
|
Swift
Swift - 数组
Swift - 数组
106 0