[AVFoundation]:缩略图生成在一段时间后会挂起

时间:2015-02-11 10:39:27

标签: objective-c image avfoundation video-processing avassetimagegenerator

我有服务器应用程序,提供有关服务器上视频的信息。其中一个请求是URL:PORT / video /:id /:time ...我解析并获取视频文件,准备时间并询问生成缩略图的方法。它可以非常快地工作前5分钟(生成200ms以下的图像),然后图像生成过程突然​​需要10秒......

你知道为什么吗?使用的代码:

-(NSImage *)thumbnailAt: (CMTime)        time
               withSize: (NSSize)        size
                  error: (NSError **)    error {

    @autoreleasepool {
         if ( self.assetChanged ) {
             self.generate = [[AVAssetImageGenerator alloc] initWithAsset:_asset];
             self.generate.appliesPreferredTrackTransform = TRUE;
             self.assetChanged = NO;
         }

         self.generate.maximumSize = NSSizeToCGSize(size);

         CGImageRef imageReference = [self.generate copyCGImageAtTime:time actualTime:NULL error:error];

        if ( imageReference != nil ) {
            NSImage* ret = [[NSImage alloc] initWithCGImage:imageReference size:size];
            CGImageRelease(imageReference);
            return ret;
        }

        return nil;
    }
}

知道我做错了什么或任何建议如何以不同方式做到(例如使用AVAssetReader)?

1 个答案:

答案 0 :(得分:0)

最后我通过使用不同的方法解决了它:我使用异步图像

-(NSImage *)createAsyncThumbnailAtTime:(CMTime)time withSize:(NSSize)size {
    if ( self.updated ) {
        [_generator cancelAllCGImageGeneration]; // Stop we did not comply in time.
        _generator = [AVAssetImageGenerator assetImageGeneratorWithAsset:_asset];
        _generator.maximumSize = NSSizeToCGSize(size);
    }

    NSMutableArray * times = [NSMutableArray array];
    [times addObject:[NSValue valueWithCMTime:time]];

    __block NSImage * image;
    __block BOOL finished = NO;

    [_generator generateCGImagesAsynchronouslyForTimes:times completionHandler:^(CMTime requestedTime, CGImageRef imageRef, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) {

        image = nil;

        if ( result == AVAssetImageGeneratorCancelled ) {
            image = nil;
            NSLog(@"CANCELLED %@", error);
            finished = YES;
        }
        else
            if ( result == AVAssetImageGeneratorFailed ) {
                image   = nil;
                NSLog(@"FAILDED %@", error);
                finished = YES;
            }
            else /* result == AVAssetImageGeneratorSucessed */
            {
                image = [[NSImage alloc] initWithCGImage:imageRef size:size];
                finished = YES;
            }
    }];

    while ( !finished ) {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    }

    return thumbnail->image;
}