генерировать CGImagesAsynchronouslyForTimes в ARC - PullRequest
4 голосов
/ 18 января 2012

Если я запускаю следующее в проекте, где включен ARC, обработчик завершения никогда не запускаетсяНо без ARC все работает как положено.Что мне здесь не хватает?

NSURL *url = [NSURL URLWithString:@"http://media.w3.org/2010/05/sintel/trailer.mp4"];
AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:url options:nil];
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator.appliesPreferredTrackTransform = YES;
CMTime thumbTime = CMTimeMakeWithSeconds(5,30);

AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, 
                                                   CGImageRef im, 
                                                   CMTime actualTime, 
                                                   AVAssetImageGeneratorResult result, 
                                                   NSError *error){
    NSLog(@"completion handler");
};

generator.maximumSize = CGSizeMake(320, 180);
[generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];

Ответы [ 3 ]

5 голосов
/ 01 марта 2012

На основании того, что Майкл указал, что генератор не сохраняется, если вы просто «используете» генератор var внутри блока завершения, все будет работать.

Так что я думаю, что ответ ...

NSURL *url = [NSURL URLWithString:@"http://media.w3.org/2010/05/sintel/trailer.mp4"];
AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:url options:nil];
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator.appliesPreferredTrackTransform = YES;
CMTime thumbTime = CMTimeMakeWithSeconds(5,30);

AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, 
                                                   CGImageRef im, 
                                                   CMTime actualTime, 
                                                   AVAssetImageGeneratorResult result, 
                                                   NSError *error){
    NSLog(@"make sure generator is used in this block and it'll work %@", generator);
};

generator.maximumSize = CGSizeMake(320, 180);
[generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];
3 голосов
/ 12 февраля 2012

Похоже, что generateCGImagesAsynchronouslyForTimes не сохраняет генераторСделайте генератор переменной-членом вашего экземпляра и присвойте ему.Как только я это сделал, все заработало.Код будет выглядеть примерно так:

NSURL *url = [NSURL URLWithString:@"http://media.w3.org/2010/05/sintel/trailer.mp4"];
AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:url options:nil];
[generator_ cancelAllCGImageGeneration];
generator_ = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator_.appliesPreferredTrackTransform = YES;
CMTime thumbTime = CMTimeMakeWithSeconds(5,30);

AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, 
                                                   CGImageRef im, 
                                                   CMTime actualTime, 
                                                   AVAssetImageGeneratorResult result, 
                                                   NSError *error){
    NSLog(@"completion handler");
};

generator_.maximumSize = CGSizeMake(320, 180);
[generator_ generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];
0 голосов
/ 19 мая 2012

Генератор изображений определенно делает не сохраняемым фреймворком. Не знаю, как часто обновляется Руководство по программированию Apple, но вы можете прочитать об этом в AV Foundation Prog. Руководство, в Генерация последовательности изображений довольно четко:

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

...