Creating thumbnail from local video in swift Creating thumbnail from local video in swift ios ios

Creating thumbnail from local video in swift


Translated with some edits from:

First frame of a video using AVFoundation

    var err: NSError? = nil    let asset = AVURLAsset(URL: NSURL(fileURLWithPath: "/that/long/path"), options: nil)    let imgGenerator = AVAssetImageGenerator(asset: asset)    let cgImage = imgGenerator.copyCGImageAtTime(CMTimeMake(0, 1), actualTime: nil, error: &err)    // !! check the error before proceeding    let uiImage = UIImage(CGImage: cgImage)    let imageView = UIImageView(image: uiImage)    // lay out this image view, or if it already exists, set its image property to uiImage


BaseZen's answer translated Swift 3 / Swift 4

You need to set the location of the video you want to make a thumbnail of as the url asset path, like:

Don't forget to import AVFoundation

func generateThumbnail(path: URL) -> UIImage? {    do {        let asset = AVURLAsset(url: path, options: nil)        let imgGenerator = AVAssetImageGenerator(asset: asset)        imgGenerator.appliesPreferredTrackTransform = true        let cgImage = try imgGenerator.copyCGImage(at: CMTimeMake(value: 0, timescale: 1), actualTime: nil)        let thumbnail = UIImage(cgImage: cgImage)        return thumbnail    } catch let error {        print("*** Error generating thumbnail: \(error.localizedDescription)")        return nil    }}

For everyone having issues with this I have created the following drop in example hosted on Github


This is a cleaned up version of David's answer and tested against iOS 11 / Swift 4.x.

Please note the different calls for handling the initial time based on which version of Swift you are using.

func generateThumbnail(url: URL) -> UIImage? {    do {        let asset = AVURLAsset(url: url)        let imageGenerator = AVAssetImageGenerator(asset: asset)        imageGenerator.appliesPreferredTrackTransform = true        // Select the right one based on which version you are using        // Swift 4.2        let cgImage = try imageGenerator.copyCGImage(at: .zero,                                                     actualTime: nil)        // Swift 4.0        let cgImage = try imageGenerator.copyCGImage(at: kCMTimeZero,                                                     actualTime: nil)        return UIImage(cgImage: cgImage)    } catch {        print(error.localizedDescription)        return nil    }}
  1. Creates an AVURLAsset from the provided URL
  2. Creates an AVAssetImageGenerator using the newly created AVURLAsset, is responsible for making the thumbnail
  3. appliesPreferredTrackTransform informs the generator to apply the matrix to the thumbnail generation. The default value is false.
  4. Attempts to create a CGImage at the first frame of the video track
  5. Creates a UIImage using the newly created CGImage & returns it
  6. If the image generation step fails, an error is caught and presented to the console along with a nil UIImage