无法使用Swift缓存生成视频缩略图

4

一直在苦苦挣扎,我正在生成视频缩略图,但是在集合视图中加载速度非常缓慢。我想要使用缓存,但是却找不到解决方案。

这是我正在使用的代码:

func previewImageFromVideo(url:NSURL) -> UIImage? {


    let asset = AVAsset(url: url as URL)
    let imageGenerator = AVAssetImageGenerator(asset:asset)
    imageGenerator.appliesPreferredTrackTransform = true
    imageGenerator.maximumSize = CGSize(width: 250, height: 120)

    var time = asset.duration
    time.value = min(time.value,2)

    do {
        let imageRef = try imageGenerator.copyCGImage(at: time, actualTime: nil)
        return UIImage(cgImage: imageRef)
    } catch {
        return nil
    }
}

我已经将它们缩小了,但仍然每次连接到服务器。请帮忙。

我尝试过了,但没有效果!你能给我展示一下这个函数的例子吗? - Marian Petrisor
3个回答

7
您可以使用 URLCache
func previewImageFromVideo(url: NSURL) -> UIImage? {
    let url = url as URL
    let request = URLRequest(url: url)
    let cache = URLCache.shared

    if
        let cachedResponse = cache.cachedResponse(for: request),
        let image = UIImage(data: cachedResponse.data)
    {
        return image
    }

    let asset = AVAsset(url: url)
    let imageGenerator = AVAssetImageGenerator(asset: asset)
    imageGenerator.appliesPreferredTrackTransform = true
    imageGenerator.maximumSize = CGSize(width: 250, height: 120)

    var time = asset.duration
    time.value = min(time.value, 2)

    var image: UIImage?

    do {
        let cgImage = try imageGenerator.copyCGImage(at: time, actualTime: nil)
        image = UIImage(cgImage: cgImage)
    } catch { }

    if
        let image = image,
        let data = UIImagePNGRepresentation(image),
        let response = HTTPURLResponse(url: url, statusCode: 200, httpVersion: nil, headerFields: nil)
    {
        let cachedResponse = CachedURLResponse(response: response, data: data)

        cache.storeCachedResponse(cachedResponse, for: request)
    }

    return image
}

1
我创建了这个扩展程序来创建和缓存来自文件管理器的视频缩略图。
您可以像这样使用它:
 let videoURL = URL(fileURLWithPath: self.videoPath)
 let thumbnailImage = videoURL.createVideoThumbnail()

扩展代码:

let imageCache = NSCache<AnyObject, AnyObject>()

extension URL {

   func createVideoThumbnail() -> UIImage? {

    if let imageFromCache = imageCache.object(forKey: self as AnyObject) as? UIImage {
        return imageFromCache
    }

    let asset = AVAsset(url: self)
    let imageGenerator = AVAssetImageGenerator(asset: asset)
    imageGenerator.appliesPreferredTrackTransform = true
    imageGenerator.maximumSize = CGSize(width: 250, height: 120)

    var time = asset.duration
    time.value = min(time.value, 2)

    do {
        let cgImage = try imageGenerator.copyCGImage(at: time, actualTime: nil)
        let image = UIImage(cgImage: cgImage)
        imageCache.setObject(image as AnyObject, forKey: self as AnyObject)
        return image
    } catch let err {
        print(err)
     }
    return UIImage()
  }
}

1
你可以使用Kingfisher生成缩略图。 注意:它将为您处理所有的缓存工作。 用法: 步骤1
import Kingfisher

步骤二

guard let url = URL(string: videoUrlString) else { return }
self.imageView.kf.setImage(with: AVAssetImageDataProvider(assetURL: url, seconds: 1))

这里是Kingfisher SDK的链接

注意:它将与最新版本的Kingfisher(版本7.2.3或更高版本)正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接