AVAssetImageGenerator случайные сбои в iOS7
У меня есть AVComposition и AVVideoComposition, которые я генерирую большие пальцы за каждые полсекунды или около того видео. Я использую инструмент анимации для некоторых наложений. Я выполняю вызов в очереди операций, и он запускается после определенных типов правок. Очередь операций является последовательной, а не асинхронной, поэтому процесс никогда не выполняется одновременно, и я проверил это. Приведенный ниже код выполняется в главном потоке в другой операции NSO, которая находится в последовательной очереди.
Теперь моя проблема в том, что большие пальцы случайно терпят неудачу без шаблона. Я могу запустить его один раз и добиться успеха. Я могу запустить его снова с точно такими же аргументами, и некоторые большие пальцы терпят неудачу. Я могу запустить его снова, и у меня не получаются разные большие пальцы.
Похоже, это связано с тем, как много других действий происходит и в других потоках, например, при запросе большого количества элементов из ALAssetLibrary или MediaFramework.
Я также упомяну, что это работало в iOS6 без этой проблемы.
Я создаю копии AVComposition и AVVideoComposition, прежде чем генерировать большие пальцы.
У кого-нибудь есть указания для меня?
Я ценю его.
//this must be called on the main thread to correctly generate overlays
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
AVAsset *asset = avComposition;
AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
generator.appliesPreferredTrackTransform = TRUE;
AVMutableVideoComposition *mutableVideoComposition = (AVMutableVideoComposition *) avVideoComposition.mutableCopy;
CALayer *baseSyncLayer = [CALayer layer];
baseSyncLayer.frame = CGRectMake(0, 0, resolution.width, resolution.height);
CALayer *videoLayer = [CALayer layer];
videoLayer.frame = CGRectMake(0, 0, resolution.width, resolution.height);
[baseSyncLayer addSublayer:videoLayer];
__unused NSArray *imageLayers = [MovieCompositionService applyImageAnimations:avComposition andLayer:baseSyncLayer andProject:project fileRender:YES addTextOverlays:addTextOverlays andResolution:resolution];
mutableVideoComposition.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:baseSyncLayer];
generator.videoComposition = mutableVideoComposition;
NSMutableArray *images = [[NSMutableArray alloc] init];
__block BOOL hasErrors = NO;
AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) {
if (!hasErrors) {
DDLogVerbose(@"ACTUAL GENERATION TIME %f", CMTimeGetSeconds(actualTime));
if (result != AVAssetImageGeneratorSucceeded) {
DDLogError(@"Failed to generate thumb: %@", error.localizedDescription);
hasErrors = YES;
[generator cancelAllCGImageGeneration];
finishBlock(images, YES);
} else {
[images addObject:[UIImage imageWithCGImage:im]];
if (CMTIME_COMPARE_INLINE(requestedTime, ==, ((NSValue *) timeIntervals.lastObject).CMTimeValue)) {
DDLogVerbose(@"Movie composition thumb generation complete");
finishBlock(images, NO);
}
}
}
};
generator.maximumSize = thumbSize;
[generator generateCGImagesAsynchronouslyForTimes:timeIntervals completionHandler:handler];
}];
1 ответ
Я использовал следующее для создания эскиза.
- (void)getThumbnailImageForTime:(float)instance_time withCompletion:(void(^)(UIImage *))completion
{
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul);
dispatch_async(queue, ^{
__block UIImage *thumb ;
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:self.videoUrl];
AVAssetImageGenerator *_generator;
_generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:playerItem.asset];
AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) {
if (result == AVAssetImageGeneratorSucceeded) {
thumb = [UIImage imageWithCGImage:image];
NSLog(@"Succesfully generater the thumbnail!!!");
} else {
NSLog(@"Failed to generater the thumbnail!!!");
NSLog(@"Error : %@",error.localizedDescription);
[self performSelector:@selector(retryingThumbnialGeneration) withObject:nil afterDelay:1.0f];
}
dispatch_async(dispatch_get_main_queue(), ^{
completion(thumb);
});
};
[_generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:CMTimeMakeWithSeconds(2,10)]] completionHandler:handler];
});
}