如何从iOS的ALAsset获取video的缩略图图像?

我想从video中获取每帧的缩略图图像,然后将这些图像保存在可变数组图像中。

我想用这个图像作为animation播放。

NSURL* assetURL = [self.asset valueForProperty:ALAssetPropertyAssetURL]; NSDictionary* assetOptions = nil; AVAsset* myAsset = [[AVURLAsset alloc] initWithURL:assetURL options:assetOptions]; self.imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:myAsset]; int duration = CMTimeGetSeconds([myAsset duration]); for(int i = 0; i<duration; i++) { CGImageRef imgRef = [self.imageGenerator copyCGImageAtTime:CMTimeMake(i, duration) actualTime:NULL error:nil]; UIImage* thumbnail = [[UIImage alloc] initWithCGImage:imgRef scale:UIViewContentModeScaleAspectFit orientation:UIImageOrientationUp]; [thumbnailImages addObject:thumbnail]; } 

我使用上面的代码来获取缩略图图像,但问题是如果有一个2秒的video,我只得到2个缩略图,但我想要20个缩略图(10个缩略图每秒)。

那么,如何使用CMTimeMake来获取每一秒的缩略图

代码表单参考网站: 来自video的缩略图图像

目标 – C

 -(UIImage *)generateThumbImage : (NSString *)filepath { NSURL *url = [NSURL fileURLWithPath:filepath]; AVAsset *asset = [AVAsset assetWithURL:url]; AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset]; self.imageGenerator.appliesPreferredTrackTransform = YES; CMTime time = [asset duration]; time.value = 0; Float duration = CMTimeGetSeconds([myAsset duration]); for(Float i = 0.0; i<duration; i=i+0.1) { CGImageRef imgRef = [self.imageGenerator copyCGImageAtTime:CMTimeMake(i, duration) actualTime:NULL error:nil]; UIImage* thumbnail = [[UIImage alloc] initWithCGImage:imgRef scale:UIViewContentModeScaleAspectFit orientation:UIImageOrientationUp]; [thumbnailImages addObject:thumbnail]; } } 

迅速

 func generateThumbImage(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 } 

Swift 3中的Kirit Modi解决scheme有一些小的变化:

 func generateThumbImage(url : URL) -> UIImage?{ let asset = AVAsset(url: url) let assetImgGenerate : AVAssetImageGenerator = AVAssetImageGenerator(asset: asset) assetImgGenerate.appliesPreferredTrackTransform = true let time = CMTimeMake(1, 30) let img = try? assetImgGenerate.copyCGImage(at: time, actualTime: nil) guard let cgImage = img else { return nil } let frameImg = UIImage(cgImage: cgImage) return frameImg } 

下面的代码从0.41video获取拇指图像

 NSString *str = [[self.videoArray objectAtIndex:i] valueForKey:@"vName"]; NSURL *videoURL = [NSURL URLWithString:str] ; MPMoviePlayerController *player = [[[MPMoviePlayerController alloc] initWithContentURL:videoURL]autorelease]; UIImage *thumbnail = [player thumbnailImageAtTime:0.41 timeOption:MPMovieTimeOptionNearestKeyFrame]; player = nil;