2012-04-19 79 views
7

我使用基于以下线程的代码的代码来生成一个视频缩略图:从视频创建缩略图 - 提速性能 - AVAsset - iPhone

Getting a thumbnail from a video url or data in iPhone SDK

我的代码如下:

if (selectionType == kUserSelectedMedia) { 

    NSURL * assetURL = [info objectForKey:UIImagePickerControllerReferenceURL]; 

    AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:assetURL options:nil]; 
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
    generator.appliesPreferredTrackTransform=TRUE; 
    [asset release]; 
    CMTime thumbTime = CMTimeMakeWithSeconds(0,30); 

    //NSLog(@"Starting Async Queue"); 

    AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){ 
     if (result != AVAssetImageGeneratorSucceeded) { 
      NSLog(@"couldn't generate thumbnail, error:%@", error); 
     } 

     //NSLog(@"Updating UI"); 

     selectMediaButton.hidden = YES; 
     selectedMedia.hidden = NO; 
     cancelMediaChoiceButton.hidden = NO; 
     whiteBackgroundMedia.hidden = NO; 

     //Convert CGImage thumbnail to UIImage. 
     UIImage * thumbnail = [UIImage imageWithCGImage:im]; 

     int checkSizeW = thumbnail.size.width; 
     int checkSizeH = thumbnail.size.height; 
     NSLog(@"Image width is %d", checkSizeW); 
     NSLog(@"Image height is %d", checkSizeH); 

     if (checkSizeW >=checkSizeH) { 
      //This is a landscape image or video. 
      NSLog(@"This is a landscape image - will resize automatically"); 
     } 

     if (checkSizeH >=checkSizeW) { 
      //This is a portrait image or video. 
      selectedIntroHeight = thumbnail.size.height; 
     } 

     //Set the image once resized. 
     selectedMedia.image = thumbnail; 

     //Set out confirm button BOOL to YES and check if we need to display confirm button. 
     mediaReady = YES; 
     [self checkIfConfirmButtonShouldBeDisplayed]; 

     //[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]; 
} 

} 

问题是在生成缩略图图像时存在大约5-10秒的延迟。无论如何,我可以提高此代码的速度并更快地生成缩略图吗?

谢谢。

回答

16

以下代码显示了创建视频的大拇指。

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

Also answer given here

+0

快得多 - 谢谢。 – GuybrushThreepwood 2012-04-19 09:51:02

+0

+1它也帮了我 – Charan 2012-04-19 09:56:43

+1

我没有得到这个网址的缩略图:http://www.sciencentral.com/news/image_db/2024515/NNM2212_AntPower_MSTR.mov ..可以请你检查一下吗? – parilogic 2013-08-07 12:18:19

11

这是一个通用的代码,则应该只通过对于该媒体文件的路径,并设置在0和1.0之间的比率。

+ (UIImage*)previewFromFileAtPath:(NSString*)path ratio:(CGFloat)ratio 
{ 
    AVAsset *asset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:path]]; 
    AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc]initWithAsset:asset]; 
    CMTime duration = asset.duration; 
    CGFloat durationInSeconds = duration.value/duration.timescale; 
    CMTime time = CMTimeMakeWithSeconds(durationInSeconds * ratio, (int)duration.value); 
    CGImageRef imageRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL]; 
    UIImage *thumbnail = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 

    return thumbnail; 
} 
3

迅速解决:

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