Getting a thumbnail from a video url or data in iOS

IosIphoneVideoThumbnails

Ios Problem Overview


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?

Ios Solutions


Solution 1 - Ios

-(UIImage *)generateThumbImage : (NSString *)filepath
{
    NSURL *url = [NSURL fileURLWithPath:filepath];

    AVAsset *asset = [AVAsset assetWithURL:url];
    AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
    imageGenerator.appliesPreferredTrackTransform = YES;
    CMTime time = [asset duration];
    time.value = 0;
    CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
    UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);  // CGImageRef won't be released by ARC
    
    return thumbnail;
}

you can get the frame using the time.value suppose you want to 1 second frame then use the

time.value = 1000 //Time in milliseconds

Solution 2 - Ios

The answer to this question is that one can now with 4.0 iOS get thumbnails using AVFoundation, the following code where the class property url is the movie url, will do the trick (you can get the thumbnail at any time, in the example its at time 0)

-(void)generateImage
{
	AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:self.url options:nil];
	AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
	generator.appliesPreferredTrackTransform=TRUE;
	[asset release];
	CMTime thumbTime = CMTimeMakeWithSeconds(0,30);
	
	AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
		if (result != AVAssetImageGeneratorSucceeded) {
			NSLog(@"couldn't generate thumbnail, error:%@", error);
		}
		[button setImage:[UIImage imageWithCGImage:im] forState:UIControlStateNormal];
		thumbImg=[[UIImage imageWithCGImage:im] retain];
		[generator release];
	};
	
	CGSize maxSize = CGSizeMake(320, 180);
	generator.maximumSize = maxSize;
	[generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];

}

Solution 3 - Ios

NSURL *videoURL = [NSURL fileURLWithPath:url];
        
MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:videoURL];
        
        UIImage *thumbnail = [player thumbnailImageAtTime:1.0 timeOption:MPMovieTimeOptionNearestKeyFrame];
        
        //Player autoplays audio on init
        [player stop];
        [player release];

Check this link for an alternative: https://stackoverflow.com/questions/19105721/thumbnailimageattime-now-deprecated-whats-the-alternative

Solution 4 - Ios

Best method I've found... MPMoviePlayerController thumbnailImageAtTime:timeOption

Solution 5 - Ios

SWIFT 2.0

You can generate in swift in two ways 1. AVFoundation 2. MPMoviePlayerController

1. 

    func generateThumnail(url : NSURL) -> UIImage{
            var asset : AVAsset = AVAsset.assetWithURL(url) as AVAsset
            var assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset)
            assetImgGenerate.appliesPreferredTrackTransform = true
            var error       : NSError? = nil
            var time        : CMTime = CMTimeMake(1, 30)
            var img         : CGImageRef = assetImgGenerate.copyCGImageAtTime(time, actualTime: nil, error: &error)
            var frameImg    : UIImage = UIImage(CGImage: img)!
            
            return frameImg
        }

2. 

    override func viewDidLoad() {
            super.viewDidLoad()
            var moviePlayer         : MPMoviePlayerController!  = MPMoviePlayerController(contentURL: moviePlayManager.movieURL)
            moviePlayer.view.frame   = CGRect(x: self.view.frame.origin.x, y: self.view.frame.origin.y, width:
                                       self.view.frame.size.width, height: self.view.frame.height)
            moviePlayer.fullscreen   = true
            moviePlayer.controlStyle = MPMovieControlStyle.None
            NSNotificationCenter.defaultCenter().addObserver(self,
        selector: "videoThumbnailIsAvailable:",
        name: MPMoviePlayerThumbnailImageRequestDidFinishNotification,
        object: nil)


        let thumbnailTimes = 3.0
        moviePlayer.requestThumbnailImagesAtTimes([thumbnailTimes],
                timeOption: .NearestKeyFrame)
        }
    
    func videoThumbnailIsAvailable(notification: NSNotification){
        
        if let player = moviePlayer{
            let thumbnail =
            notification.userInfo![MPMoviePlayerThumbnailImageKey] as? UIImage
            
            if let image = thumbnail{
                
                /* We got the thumbnail image. You can now use it here */
                println("Thumbnail image = \(image)")
            }
        }

Solution 6 - Ios

Swift 2 code:

func previewImageForLocalVideo(url:NSURL) -> UIImage?
{
    let asset = AVAsset(URL: url)
    let imageGenerator = AVAssetImageGenerator(asset: asset)
    imageGenerator.appliesPreferredTrackTransform = true
    
    var time = asset.duration
    //If possible - take not the first frame (it could be completely black or white on camara's videos)
    time.value = min(time.value, 2)
    
    do {
        let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil)
        return UIImage(CGImage: imageRef)
    }
    catch let error as NSError
    {
        print("Image generation failed with error \(error)")
        return nil
    }
}

Solution 7 - Ios

> For Swift 3.0

func createThumbnailOfVideoFromFileURL(_ strVideoURL: String) -> UIImage?{

let asset = AVAsset(url: URL(string: strVideoURL)!)
let assetImgGenerate = AVAssetImageGenerator(asset: asset)
assetImgGenerate.appliesPreferredTrackTransform = true
let time = CMTimeMakeWithSeconds(Float64(1), 100)
do {
  let img = try assetImgGenerate.copyCGImage(at: time, actualTime: nil)
  let thumbnail = UIImage(cgImage: img)
  return thumbnail
} catch {
  /* error handling here */
}
return nil   }

Solution 8 - Ios

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

Solution 9 - Ios

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

Solution 10 - Ios

Maybe this is useful for someone else who faces the same problem. I needed an easy solution for creating a thumbnail for Images, PDFs and Videos. To solve that problem I've created the following Library.

https://github.com/prine/ROThumbnailGenerator

The usage is very straightforward:

var thumbnailImage = ROThumbnail.getThumbnail(url)

It has internally three different implementations and depending on the file extension it does create the thumbnail. You can easily add your own implementation if you need a thumbnail creator for another file extension.

Solution 11 - Ios

Swift 2.1 Getting thumbnails at required time intervals

func getPreviewImageForVideoAtURL(videoURL: NSURL, atInterval: Int) -> UIImage? {
    print("Taking pic at \(atInterval) second")
    let asset = AVAsset(URL: videoURL)
    let assetImgGenerate = AVAssetImageGenerator(asset: asset)
    assetImgGenerate.appliesPreferredTrackTransform = true
    let time = CMTimeMakeWithSeconds(Float64(atInterval), 100)
    do {
        let img = try assetImgGenerate.copyCGImageAtTime(time, actualTime: nil)
        let frameImg = UIImage(CGImage: img)
        return frameImg
    } catch {
        /* error handling here */
    }
    return nil
}

Solution 12 - Ios

You will get Thumbnail Image From URL when you change "fileURLWithPath" to "URLWithString".

In My case it worked like this.

NSURL *url = [NSURL URLWithString:filepath];
AVAsset *asset = [AVAsset assetWithURL:url];
AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset];
CMTime time = [asset duration];
time.value = 0;
CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL];
UIImage *thumbnail = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);

return thumbnail;

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDanielView Question on Stackoverflow
Solution 1 - IosDiken ShahView Answer on Stackoverflow
Solution 2 - IosDanielView Answer on Stackoverflow
Solution 3 - IosBushra ShahidView Answer on Stackoverflow
Solution 4 - IosE-MaddView Answer on Stackoverflow
Solution 5 - IosDharmbir SinghView Answer on Stackoverflow
Solution 6 - IosAvtView Answer on Stackoverflow
Solution 7 - IosHiren PanchalView Answer on Stackoverflow
Solution 8 - IosRajender KumarView Answer on Stackoverflow
Solution 9 - IosRaj AryanView Answer on Stackoverflow
Solution 10 - IosPrineView Answer on Stackoverflow
Solution 11 - Iosmanoj kumarView Answer on Stackoverflow
Solution 12 - IosVirendra PatilView Answer on Stackoverflow