2011-11-28 3 views
13

J'utilise UIImagePicker pour permettre à l'utilisateur de créer une vidéo, puis de la découper. Je dois diviser cette vidéo en plusieurs cadres et laisser l'utilisateur en choisir un.iOS extraire des images vidéo en tant qu'images

Afin d'afficher les cadres, je dois probablement les convertir en UIImage. Comment puis-je faire ceci? Je dois utiliser AVFoundation, mais je n'ai pas pu trouver un tutoriel sur la façon d'obtenir & convertir les cadres.

Est-ce que je devrais aussi faire la capture d'image avec AVFoundation? Si oui, est-ce que je dois mettre en place la coupe moi-même?

Répondre

6

Voici le code pour obtenir des images de la vidéo FPS

1) Importation

#import <Photos/Photos.h> 

2) dans 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) Fonctions

-(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."); 
     } 
    }]; 
} 
Questions connexes