Getting a thumbnail from a video url or data in iOS

Viewed 72857

I am trying to acquire a thumbnail (of the first frame) from a video taken from iphone 3GS camera so I can display it. How to do this?

12 Answers

Swift 4

func generateThumbnail(for asset:AVAsset) -> UIImage? {
    let assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset)
    assetImgGenerate.appliesPreferredTrackTransform = true
    let time = CMTimeMake(value: 1, timescale: 2)
    let img = try? assetImgGenerate.copyCGImage(at: time, actualTime: nil)
    if img != nil {
        let frameImg  = UIImage(cgImage: img!)
       return frameImg
    }
    return nil
}

How to use:

   func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    picker.dismiss(animated: true) {

        switch mediaType {
        case kUTTypeMovie:
            guard info[UIImagePickerController.InfoKey.mediaType] != nil, let url = info[UIImagePickerController.InfoKey.mediaURL] as? URL else { return }
            let asset = AVAsset(url: url)
            guard let img = self.generateThumbnail(for: asset) else {
                print("Error: Thumbnail can be generated.")
                return
            }
            print("Image Size: \(img.size)")
            break
        default:
            break
        }
    }
}

For Swift 5

import AVKit

Code:

// Get Thumbnail Image from URL
fileprivate func getThumbnailFromUrl(_ url: String?, _ completion: @escaping ((_ image: UIImage?)->Void)) {

    guard let url = URL(string: url ?? "") else { return }
    DispatchQueue.main.async {
        let asset = AVAsset(url: url)
        let assetImgGenerate = AVAssetImageGenerator(asset: asset)
        assetImgGenerate.appliesPreferredTrackTransform = true

        let time = CMTimeMake(value: 2, timescale: 1)
        do {
            let img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil)
            let thumbnail = UIImage(cgImage: img)
            completion(thumbnail)
        } catch {
            print("Error :: ", error.localizedDescription)
            completion(nil)
        }
    }
}

Usage :: Take one Image View

@IBOutlet weak var imgThumbnail: UIImageView!

Then after call getThumbnailFromUrl method for thumbnail with URL String as parameter

self.getThumbnailFromUrl(videoURL) { [weak self] (img) in

        guard let _ = self else { return }
        if let img = img {
            self?.imgThumbnail.image = img
        }
    }

pls try this if it is use full then pls comment Thank you

Related