使用AVAssetImageGenerator生成缩略图栏

时间:2014-11-25 10:42:32

标签: ios8 uikit

我正在使用以下代码生成一个缩略图栏:

NSArray *times = [self timesForDuration:_videoAsset.duration andCount:self.numberOfThumbnails];

__block int i = 0;

[_imageGenerator generateCGImagesAsynchronouslyForTimes:times completionHandler:^(CMTime requestedTime, CGImageRef image, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error) {
    if (result == AVAssetImageGeneratorSucceeded) {
        UIImageView *imageView = [self imageViewForImage:image atPosition:i];

        CGImageRelease(image);

        dispatch_async(dispatch_get_main_queue(), ^{
            [_videoBarView addSubview:imageView];
        });
    }
    ++i;
}];

它有点工作,但问题是视图整体更新非常缓慢,你可以看到栏中的空白......一段时间后,栏会按预期显示所有请求的缩略图。

从调试器我可以看出缩略图生成实际上非常快,那么这里发生了什么?

我见过一种解决方法,只会使用copyCGImageAtTime同步生成每个图像,但这可能会导致用户界面无法响应。

1 个答案:

答案 0 :(得分:1)

问题似乎是由UIImageView块之外的dispatch_async对象的创建引起的;将该代码放在块中可以解决问题:

if (result == AVAssetImageGeneratorSucceeded) {
    __block int position = i;
    CGImageRetain(image);

    dispatch_async(dispatch_get_main_queue(), ^{
        UIImageView *imageView = [self imageViewForImage:image atPosition:position];

        [_videoBarView addSubview:imageView];

        CGImageRelease(image);
    });
}
++i;