web-dev-qa-db-ja.com

iOSがビデオフレームを画像として抽出

UIImagePickerを使用して、ユーザーがビデオを作成してトリミングできるようにしています。そのビデオを複数のフレームに分割し、ユーザーにそのうちの1つを選択させる必要があります。

フレームを表示するには、フレームをUIImageに変換する必要があります。これどうやってするの? AVFoundationを使用する必要がありますが、フレームを取得および変換する方法に関するチュートリアルが見つかりませんでした。

AVFoundationでも画像キャプチャを行う必要がありますか?もしそうなら、私は自分でトリミングを実装する必要がありますか?

14
MB.

この質問の答えはあなたが探しているものだと思います。

iPhoneはAVFoundationを使用してビデオからUIimage(フレーム)を読み取ります

受け入れられた答えによって指定された2つの方法があります。要件に応じてどちらかを使用できます。

12
Robin

ビデオから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.");
        }
    }];
}
8
Hardik Thakkar

AVFoundationに基づいて、lib VideoBufferReader( GitHubを参照 )を使用することもできます。

0
CrimeZone