2012-04-19 7 views
7

I-Code bin mit basierend auf dem Code im folgende Threads ein Video-Thumbnail zu generieren:Thumbnail von Video erstellen - Verbesserung der Geschwindigkeitsleistung - AVAsset - iPhone

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

Mein Code ist wie folgt:

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

} 

Das Problem ist, dass es eine Verzögerung von etwa 5-10 Sekunden bei der Erstellung des Miniaturbilds gibt. Gibt es trotzdem, dass ich die Geschwindigkeit dieses Codes verbessern und das Thumbnail schneller generieren könnte?

Vielen Dank.

Antwort

16

Der folgende Code zeigt die Erstellung der Daumen eines Videos.

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

Viel schneller - danke. – GuybrushThreepwood

+0

+1 es hat mir auch geholfen – Charan

+1

Ich bekomme kein Thumbnail für diese URL: http://www.sciencentral.com/news/image_db/2024515/NNM2212_AntPower_MSTR.mov ..Kannst du das bitte überprüfen? – parilogic

11

Dies ist ein allgemeiner Code, sollten Sie nur einen Pfad für die Mediendatei übergeben und das Verhältnis zwischen 0 und 1,0 eingestellt.

+ (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

Swift Lösung:

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