2012-04-19 23 views
7

Tôi đang sử dụng mã dựa trên mã trong các chủ đề sau đây để tạo ra một hình thu nhỏ video:Tạo Thumbnail từ Video - Cải thiện Hiệu suất Tốc độ - AVAsset - iPhone

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

Mã của tôi là như sau:

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

} 

Vấn đề là có sự chậm trễ khoảng 5-10 giây khi tạo hình thu nhỏ. Có anyway mà tôi có thể cải thiện tốc độ của mã này và tạo ra các hình thu nhỏ nhanh hơn?

Cảm ơn bạn.

Trả lời

16

Mã sau cho thấy việc tạo ngón tay cái của video.

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

Phần lớn nhanh hơn - cảm ơn bạn. – GuybrushThreepwood

+0

+1 nó đã giúp tôi cũng – Charan

+1

Tôi không nhận được hình thu nhỏ cho url này: http://www.sciencentral.com/news/image_db/2024515/NNM2212_AntPower_MSTR.mov ..Bạn có thể kiểm tra không? – parilogic

11

Đây là một mã chung, bạn chỉ nên thông qua một đường dẫn cho các tập tin phương tiện truyền thông và thiết lập tỷ số giữa 0 và 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

giải pháp Swift:

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 
    } 
} 
Các vấn đề liên quan