Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot generate Video Thumbnails with Cache in Swift

Been struggling to make it work. I am generating the Video Thumbnails but it's loading really heavily in a collection view. I would like to cache them and I can not find a solution.

This is the code I am using:

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

I've made them very small, but still connecting every time to the server. Please help.

like image 558
Marian Petrisor Avatar asked Oct 14 '25 17:10

Marian Petrisor


2 Answers

You can use the 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
}
like image 71
par Avatar answered Oct 17 '25 08:10

par


You can use Kingfisher to generate the thumbnail.

Note:- It will handle all the cache work for you.

Usage:-

Step 1

import Kingfisher

Step 2

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

Here is the link of Kingfisher SDK

  • https://github.com/onevcat/Kingfisher

Note:- It will work fine with latest version of kingfisher/ higher or equals to version 7.2.3

like image 22
Shivam Garg Avatar answered Oct 17 '25 08:10

Shivam Garg



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!