【问题标题】:Swift3: Displaying Video in Collection ViewSwift3:在集合视图中显示视频
【发布时间】:2018-04-02 09:13:03
【问题描述】:

我对 Swift 比较陌生。

我目前正在尝试抓取存储在照片库中的视频并将它们显示在收藏视图中。在收藏视图中选择视频后,我希望能够播放该视频。

现在我已经编写了部分功能 grabVideos,我有 2 个问题:

  1. 我应该如何存储这些视频?它们可以存储为 UIImages 吗?我发现的许多其他来源都是从在线来源抓取视频,他们只是存储了视频网址
  2. 我应该在resultHandler中做什么?我会假设那是我将我的视频存储到一个全局数组中

注意:下面的代码在一个名为 getVideos() 的函数中

    let imgManager = PHImageManager.default()
    let requestOption = PHVideoRequestOptions()
    requestOption.isSynchronous = true
    requestOption.deliveryMode = .highQualityFormat

    let fetchOption = PHFetchOptions()
    fetchOption.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

    if let fetchResult:PHFetchResult = PHAsset.fetchAssets(with: .video, options: fetchOption) {

        if fetchResult.count > 0 {
            for i in 0...fetchResult.count {
                imgManager.requestAVAsset(forVideo: fetchResult.object(at: i) as! PHAsset, options: requestOption, resultHandler: {{ (<#AVAsset?#>, <#AVAudioMix?#>, <#[AnyHashable : Any]?#>) in
                    <#code#>
                    }})
            }
        } else {
            print("Error: No Videos Found")
        }
    }

【问题讨论】:

  • 您要显示视频或视频的缩略图(例如视频的一个关键帧)
  • 我想在收藏视图中显示缩略图,但选择后,我想播放视频

标签: ios swift video uicollectionview


【解决方案1】:

首先你添加一个变量到你的 ViewController var fetchResults: PHFetchResult&lt;PHAsset&gt;?

然后你在viewDidLoad 中执行获取,例如

let fetchOption = PHFetchOptions()
    fetchOption.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

let fetchResults = PHAsset.fetchAssets(with: .video, options: fetchOption);
self.fetchResults = fetchResults

if fetchResults.count == 0 {
    print("Error: No Videos Found")
    return
}

在您的collectionViewCell 中,您必须添加一个UIImageView 以便我们可以在每个单元格中显示缩略图,然后您只需在集合视图数据源方法中执行以下操作

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return fetchResults?.count ?? 0
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "reuse", for: indexPath) as! TestCollectionViewCell
    let videoAsset = fetchResults!.object(at: indexPath.item)
    PHImageManager.default().requestImage(for: videoAsset, targetSize: cell.bounds.size, contentMode: .aspectFill, options: nil) { (image: UIImage?, info: [AnyHashable : Any]?) in
        cell.imageView.image = image
    }

    return cell
}

这可以被批准,但第一次尝试就可以了,特别是看看使用PHCachingImageManager而不是PHImageManager,更多关于这个在下面的链接中:

PHCachingImageManager

How to use PHCachingImageManager

如何播放来自PHAsset的视频你可以找到答案:

Swift - Playing Videos from iOS PHAsset

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多