2009-10-05 5 views
12

Я пытаюсь получить первый кадр из выбранного видео в UIImagePickerController, чтобы показать его в UIImageView, но я не знаю, возможно ли это. Если да, то как мне это сделать?Схват первого кадра видео с UIImagePickerController?

+0

подобный вопрос http://stackoverflow.com/questions/1347562/getting-thumbnail-from-a-video-url-or-data-in-iphone-sdk –

ответ

27

Вы можете сделать это одним из двух способов. Первый способ заключается в использовании MPMoviePlayerController, чтобы захватить миниатюру:

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

Это работает, но MPMoviePlayerController не особенно легкий объект и не особенно быстро, захватывая эскизы.

Предпочтительным способом является использование нового AVAssetImageGenerator в AVFoundation. Это быстрый, легкий и более гибкий, чем старый. Вот вспомогательный метод, который вернет автореализованное изображение из видео.


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

использование 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

Вы также должны добавить фреймворк «Core Media» к своей цели. –

+0

+1 Мой коллега не смог написать что-то вроде этого, но thx вам ... –

+0

для других, кто пытается это использовать: обратите внимание, если videoURL был создан файловым_WithPath или URLWithString (когда у вас есть путь в NSString *) – user1105951