AVAssetImageGenerator性能问题

Dau*_*kas 7 objective-c uitableview ios avasset avassetimagegenerator

我正在尝试创建一个视频库.

要显示我正在使用的视频UICollectionView.每个UICollectionViewCell都有一个背景与视频缩略图.要生成视频缩略图,我使用的是逻辑方法:

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil];

AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];

generator.appliesPreferredTrackTransform = YES;

CMTime time = CMTimeMakeWithSeconds(0,15);

AVAssetImageGeneratorCompletionHandler handler = ^(CMTime timeRequested, CGImageRef image, CMTime timeActual, AVAssetImageGeneratorResult result, NSError *error)
{
    NSLog(@"handler^()");

    if (result == AVAssetImageGeneratorSucceeded)
    {
        thumbnail = [UIImage imageWithCGImage: image];

        success(thumbnail);
    }

    else
    {
        failure(error);
    }
};

CGSize maximumSize = CGSizeMake(CLIPBOARD_COLLECTION_VIEW_CELL_WIDTH, CLIPBOARD_COLLECTION_VIEW_CELL_HEIGHT);

generator.maximumSize = maximumSize;

NSLog(@"generateCGImagesAsynchronouslyForTimes:");
[generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:time]] completionHandler:handler];
Run Code Online (Sandbox Code Playgroud)

我注意到generateCGImagesAsynchronouslyForTimes它不能完全异步工作.此方法调用之间有一个时间空间.当我加载表格视图单元格时,这会导致很大的延迟.如果我评论行[generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:time]] completionHandler:handler],则没有可见的滞后(也没有图像).

我该如何解决这个性能问题?

jsz*_*ski 3

AVAssetImageGeneratorCompletionHandler不保证在主线程上调用该块:

\n\n
\n

与 AV Foundation 并行编程

\n\n

来自 AV Foundation\xe2\x80\x94 的调出块、键值观察器和通知处理程序\xe2\x80\x94 的调用不保证在任何特定线程或队列上进行。相反,AV Foundation 在执行其内部任务的线程或队列上调用这些处理程序。您负责测试调用处理程序的线程或队列是否适合您要执行的任务。如果它\xe2\x80\x99s不是(例如,如果您想更新用户界面并且标注不在主线程上),则必须将任务的执行重定向到您识别的安全线程或队列,或者您为此目的而创建的。

\n
\n\n

调用successand failurewith可以dispatch_async解决问题吗?

\n\n
dispatch_async(dispatch_get_main_queue(), ^{\n    if (success) {\n        success();\n    }\n)};\n
Run Code Online (Sandbox Code Playgroud)\n