首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS7中的AVAssetImageGenerator随机故障

iOS7中的AVAssetImageGenerator随机故障
EN

Stack Overflow用户
提问于 2013-09-20 22:28:58
回答 1查看 1.1K关注 0票数 5

我使用动画工具来做一些覆盖。我在一个操作队列上执行调用,它在某些类型的编辑之后触发。下面的代码是在串行队列中另一个NSOperation的主线程上执行的。

现在我的问题是,拇指随机失败,没有模式。我可以运行它一次,然后让它全部成功。我可以用完全相同的参数再次运行它,但会有一些拇指失败。我可以再次运行它,但不同的拇指出现故障。

这似乎与其他线程中正在进行的其他活动有关,比如从ALAssetLibrary或MediaFramework查询大量项目。

我还会提到这在没有这个问题的iOS6中工作。

在生成thumbs之前,我确实创建了AVComposition和AVVideoComposition的副本。

有人对我有什么建议吗?

我很感激。

代码语言:javascript
复制
//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];
}];
EN

回答 1

Stack Overflow用户

发布于 2015-06-18 18:45:43

我使用下面的代码来生成缩略图。

代码语言:javascript
复制
- (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];

    });

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18919254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档