iOS AVFoundation - Преобразование видео в изображения со скоростью 60 кадров в секунду

Я пытаюсь преобразовать целое видео в последовательность изображений со скоростью 60 кадров в секунду, что означает 60 кадров в секунду. изображения, генерируемые в секунду видео...

Для этого я использую AVAssetImageGenerator и метод generateCGImagesAsynchronouslyForTimes...

Все идет хорошо, за исключением того, что у меня серьезные проблемы с производительностью, связанные с пакетной обработкой время выполнения (примерно 5 минут для 13-секундного видео)...

Кроме того, выше следующего размера CGSizeMake(512, 324), я испытываю сбои...

Кто-нибудь уже имел опыт с такой обработкой и знает, как сократить это время выполнения, а также иметь возможность извлекать изображения с более высоким разрешением?

Ниже приведен код, который я тестирую...

NSURL *movieURL = [NSURL fileURLWithPath:getCaptureMoviePath()];

AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:movieURL options:nil];
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc]  initWithAsset:asset];
generator.appliesPreferredTrackTransform=TRUE;
generator.requestedTimeToleranceAfter=kCMTimeZero;
generator.requestedTimeToleranceBefore=kCMTimeZero;
NSMutableArray *thumbTimes=[NSMutableArray arrayWithCapacity:asset.duration.value];

for(int t=0;t < asset.duration.value;t=t+2) {
    CMTime thumbTime = CMTimeMake(t, asset.duration.timescale);
    NSLog(@"Time Scale : %d ", asset.duration.timescale);
    NSValue *v=[NSValue valueWithCMTime:thumbTime];
        [thumbTimes addObject:v];
}
NSLog(@"thumbTimes array contains %d objects : ", [thumbTimes count]);
[asset release];
AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) {
    if (result != AVAssetImageGeneratorSucceeded) {
        NSLog(@"couldn't generate thumbnail, error:%@", error);
    } else {
        NSLog(@"actual time: %lld/%d (requested: %lld/%d)",actualTime.value,actualTime.timescale,requestedTime.value,requestedTime.timescale);
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"yyyyMMdd-HHmmss"];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *filename = [NSString stringWithFormat:@"%@.png", [formatter stringFromDate:[NSDate date]]];
        NSString *filepath = [documentsDirectory stringByAppendingPathComponent:filename];
        CFURLRef url = (CFURLRef)[NSURL fileURLWithPath:filepath];
        CGImageDestinationRef destination = CGImageDestinationCreateWithURL(url, kUTTypePNG, 1, NULL);
        CGImageDestinationAddImage(destination, im, nil);
        if (!CGImageDestinationFinalize(destination)) {     
            NSLog(@"Failed to write image to %@", filepath);
        }
        CFRelease(destination);
    }
    //[generator release];
};
CGSize maxSize = CGSizeMake(512, 324);
generator.maximumSize = maxSize;

[generator generateCGImagesAsynchronouslyForTimes:thumbTimes completionHandler:handler];

Заранее благодарю вас,

j.

5
задан Sooriah Joel 8 June 2012 в 09:46
поделиться