2011-11-28 12 views
13

Estoy usando UIImagePicker para permitir al usuario crear un video y luego recortarlo. Necesito dividir ese video en varios cuadros y dejar que el usuario elija uno de ellos.iOS extrayendo cuadros de video como imágenes

Para mostrar los marcos probablemente deba convertirlos a UIImage. ¿Cómo puedo hacer esto? Debo usar AVFoundation pero no pude encontrar un tutorial sobre cómo obtener & convertir los marcos.

¿Debo hacer la captura de imagen con AVFoundation también? Si es así, ¿tengo que implementar el recorte yo mismo?

Respuesta

6

Aquí es código para obtener imágenes de vídeo FPS

1) Importación

#import <Photos/Photos.h> 

2) en viewDidLoad

videoUrl = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"VfE_html5" ofType:@"mp4"]]; 
    [self createImage:5]; // 5 is frame per second (FPS) you can change FPS as per your requirement. 

3) Funciones

-(void)createImage:(int)withFPS { 
    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoUrl options:nil]; 
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
    generator.requestedTimeToleranceAfter = kCMTimeZero; 
    generator.requestedTimeToleranceBefore = kCMTimeZero; 

    for (Float64 i = 0; i < CMTimeGetSeconds(asset.duration) * withFPS ; i++){ 
     @autoreleasepool { 
      CMTime time = CMTimeMake(i, withFPS); 
      NSError *err; 
      CMTime actualTime; 
      CGImageRef image = [generator copyCGImageAtTime:time actualTime:&actualTime error:&err]; 
      UIImage *generatedImage = [[UIImage alloc] initWithCGImage:image]; 
      [self savePhotoToAlbum: generatedImage]; // Saves the image on document directory and not memory 
      CGImageRelease(image); 
     } 
    } 
} 

-(void)savePhotoToAlbum:(UIImage*)imageToSave { 

    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{ 
     PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:imageToSave]; 
    } completionHandler:^(BOOL success, NSError *error) { 
     if (success) { 
      NSLog(@"sucess."); 
     } 
     else { 
      NSLog(@"fail."); 
     } 
    }]; 
}