2009-10-05 8 views

Répondre

27

Vous pouvez le faire de deux façons. La première est d'utiliser le MPMoviePlayerController pour saisir la miniature:

MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] 
             initWithContentURL:videoURL]; 
moviePlayer.shouldAutoplay = NO; 
UIImage *thumbnail = [moviePlayer thumbnailImageAtTime:time 
        timeOption:MPMovieTimeOptionNearestKeyFrame]; 

Cela fonctionne, mais MPMoviePlayerController est pas un objet particulièrement léger et pas particulièrement rapide saisissant les vignettes.

La méthode préférée consiste à utiliser le nouveau AVAssetImageGenerator dans AVFoundation. C'est rapide, léger et plus flexible que l'ancienne. Voici une méthode d'assistance qui retournera une image auto-libérée de la vidéo.


+ (UIImage *)thumbnailImageForVideo:(NSURL *)videoURL 
          atTime:(NSTimeInterval)time 
{ 

    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil]; 
    NSParameterAssert(asset); 
    AVAssetImageGenerator *assetIG = 
       [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
    assetIG.appliesPreferredTrackTransform = YES; 
    assetIG.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels; 

    CGImageRef thumbnailImageRef = NULL; 
    CFTimeInterval thumbnailImageTime = time; 
    NSError *igError = nil; 
    thumbnailImageRef = 
      [assetIG copyCGImageAtTime:CMTimeMake(thumbnailImageTime, 60) 
          actualTime:NULL 
            error:&igError]; 

    if (!thumbnailImageRef) 
     NSLog(@"thumbnailImageGenerationError %@", igError); 

    UIImage *thumbnailImage = thumbnailImageRef 
          ? [[UIImage alloc] initWithCGImage:thumbnailImageRef] 
          : nil; 

    return thumbnailImage; 
} 

utilisation Asynchronous


- (void)thumbnailImageForVideo:(NSURL *)videoURL atTime:(NSTimeInterval)time completion:(void (^)(UIImage *)) completion 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 

     AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil]; 
     NSParameterAssert(asset); 
     AVAssetImageGenerator *assetIG = 
     [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
     assetIG.appliesPreferredTrackTransform = YES; 
     assetIG.apertureMode = AVAssetImageGeneratorApertureModeEncodedPixels; 

     CGImageRef thumbnailImageRef = NULL; 
     CFTimeInterval thumbnailImageTime = time; 
     NSError *igError = nil; 
     thumbnailImageRef = 
     [assetIG copyCGImageAtTime:CMTimeMake(thumbnailImageTime, 60) 
         actualTime:NULL 
          error:&igError]; 

     if (!thumbnailImageRef) 
      NSLog(@"thumbnailImageGenerationError %@", igError); 

     UIImage *thumbnailImage = thumbnailImageRef 
     ? [[UIImage alloc] initWithCGImage:thumbnailImageRef] 
     : nil; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      completion(thumbnailImage); 
     }); 
    }); 
} 
+1

Vous devez également ajouter le cadre "Core Media" à votre cible. –

+0

+1 Mon collègue n'a pas pu écrire quelque chose comme ça, mais merci à vous ... –

+0

pour les autres qui essaient d'utiliser ceci: faites attention si videoURL a été créé par fileURLWithPath ou URLWithString (quand vous avez le chemin dans NSString *) – user1105951

Questions connexes