Почему AVAssetImageGenerator generateCGImagesAsynchronouslyForTimes приводит к сбою приложения

Я пытаюсь извлечь 2 кадра в секунду из видео, используя generateCGImagesAsynchronouslyForTimes. Но мое приложение вылетает. Я отслеживаю использование памяти, но она не превышает 14 МБ.

Вот код:

- (void) createImagesFromVideoURL:(NSURL *) videoUrl atFPS: (int) reqiuredFPS completionBlock: (void(^) (NSMutableArray *frames, CGSize frameSize)) block
{
    NSMutableArray *requiredFrames = [[NSMutableArray alloc] init];

    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoUrl options:nil];

    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];

    generator.requestedTimeToleranceAfter =  kCMTimeZero;

    generator.requestedTimeToleranceBefore =  kCMTimeZero;

    generator.appliesPreferredTrackTransform = YES;

    UIImage *sampleGeneratedImage;

    for (Float64 i = 0; i < CMTimeGetSeconds(asset.duration) *  reqiuredFPS ; i++)
    {
        CMTime time = CMTimeMake(i, reqiuredFPS);

        NSError *err;

        CMTime actualTime;

        CGImageRef image = [generator copyCGImageAtTime:time actualTime:&actualTime error:&err];

        if (! err)
        {
            sampleGeneratedImage = [[UIImage alloc] initWithCGImage:image];
            break;
        }
    }

    //Get the maximum size from 1 frame
    generator.maximumSize = [self getMultipleOf16AspectRatioForCurrentFrameSize:sampleGeneratedImage.size];

    NSMutableArray *requestedFrameTimes = [[NSMutableArray alloc] init];

    for (Float64 i = 0; i < CMTimeGetSeconds(asset.duration) *  reqiuredFPS ; i++)
    {
        CMTime time = CMTimeMake(i, reqiuredFPS);

        [requestedFrameTimes addObject:[NSValue valueWithCMTime:time]];
    }

    [generator generateCGImagesAsynchronouslyForTimes:[requestedFrameTimes copy] completionHandler:^(CMTime requestedTime, CGImageRef  _Nullable image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError * _Nullable error) {

        if (image)
        {
            UIImage *generatedImage = [UIImage imageWithCGImage:image];

            [requiredFrames addObject:generatedImage];
        }

        if (CMTimeCompare(requestedTime, [[requestedFrameTimes lastObject] CMTimeValue]) == 0)
        {
            NSLog(@"Image processing complete");

            dispatch_async(dispatch_get_main_queue(), ^{
                block(requiredFrames, generator.maximumSize);
            });
        }

        else
        {
            NSLog(@"Getting frame at %lld", actualTime.value/actualTime.timescale);
        }
    }];
}

person nr5    schedule 04.07.2017    source источник
comment
Что такое сбой, который вы получаете, и какая строка вызывает его?   -  person Tamás Sengel    schedule 04.07.2017
comment
Ничего не умирает у меня при извлечении 33 или 34-го кадра. Без ошибок   -  person nr5    schedule 04.07.2017
comment
это не ответит на ваш вопрос, но вы должны отпустить CGImage, если вы позвоните copyCGImageAtTime   -  person Tiko    schedule 04.07.2017
comment
Вы не можете сохранить все эти изображения/кадры, не исчерпав памяти. Обязательно сохраняйте только несколько за раз.   -  person Rhythmic Fistman    schedule 05.07.2017
comment
Но я использую copyCGImageAtTime только один раз, чтобы получить размер кадра. Для остальных кадров используется generateCGImagesAsynchronouslyForTimes.   -  person nr5    schedule 05.07.2017
comment
@Tiko Любое предложение, как я могу проверить точную ошибку? Через инструменты или что-то в этом роде. Отладчик не дает никаких подробностей.   -  person nr5    schedule 05.07.2017