代码之家  ›  专栏  ›  技术社区  ›  Marian Petrisor

无法使用swift中的缓存生成视频缩略图

  •  2
  • Marian Petrisor  · 技术社区  · 7 年前

    一直在努力工作。我正在生成视频缩略图,但它在集合视图中的加载量非常大。我想缓存它们,但找不到解决方案。

    这是我使用的代码:

    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
        }
    }
    

    我把它们做得很小,但每次都要连接到服务器。请帮忙。

    2 回复  |  直到 7 年前
        1
  •  3
  •   par    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
    }
    
        2
  •  1
  •   Yassine En    7 年前

     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()
    }