如何从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.41
video获取拇指图像
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;