iOS将视频帧提取为图像

时间:2011-11-28 05:05:54

标签: ios avfoundation

我正在使用UIImagePicker来允许用户创建视频然后修剪它。我需要将该视频分成多个帧,让用户选择其中一个。

为了显示帧,我可能必须将它们转换为UIImage。我怎样才能做到这一点?我必须使用AVFoundation,但我找不到如何获得&转换帧。

我是否应该使用AVFoundation进行图像捕捉?如果是这样,我必须自己实施修剪?

3 个答案:

答案 0 :(得分:12)

我认为这个问题的答案就是你要找的。

iPhone Read UIimage (frames) from video with AVFoundation

接受的答案指定了2种方法。您可以根据自己的要求使用其中任何一个。

答案 1 :(得分:8)

以下是从视频中获取FPS图片的代码

  

1)导入

#import <Photos/Photos.h>
  

2)在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)功能

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

答案 2 :(得分:0)

您还可以使用基于AVFoundation的lib VideoBufferReader(see on GitHub)。