0

我目前正在处理一个项目,该项目涉及从 UIImagepickerController 导入的UICollectionView填充AVAssets对象,在集合中有 10 个左右的项目后,滚动变得迟缓和缓慢,偶尔我会收到内存警告。我相信问题出在实时发生的缩略图生成中,这是我使用的代码:

- (void) setAsset:(AVAsset *)asset
{
    _asset = asset;
    AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:_asset];
    NSError *err = NULL;
    CMTime time = CMTimeMake(1, 60);
    generate.appliesPreferredTrackTransform = YES;
    CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err];
    self.VideoImageView.image = [UIImage imageWithCGImage:(imgRef)];
}

还有另一种不那么“昂贵的方式”可以毫不拖延地实现这一目标吗?任何有关此事的帮助将不胜感激。

4

4 回答 4

0

您可以在后台线程上实时生成缩略图,然后在操作完成后跳回主线程设置实际缩略图。

现在你在主线程上做所有事情,这会阻塞 UI,并使滚动生涩。

于 2015-05-05T10:37:06.407 回答
0

您可以在单元格中设置占位符图像并在后台队列中生成缩略图。然后将其设置为您的图像视图。

AsynImageView可能对您有用。

于 2015-05-05T10:37:18.333 回答
0

打开另一个线程来处理图像的事情。当您的图像完成后切换回主线程以更新单元格。你可以用 GCD 做到这一点

于 2015-05-05T12:00:14.443 回答
0

这是异步生成视频缩略图的代码。

-(void)generateImage
{
    NSURL *url = [NSURL fileURLWithPath:_videoPath];
    AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:url options:nil];
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    generator.appliesPreferredTrackTransform=TRUE;

    CMTime thumbTime = CMTimeMakeWithSeconds(30,30);

    AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){
        if (result != AVAssetImageGeneratorSucceeded) {
            NSLog(@"couldn't generate thumbnail, error:%@", error);
        }
        // TODO Do something with the image
    };

    CGSize maxSize = CGSizeMake(128, 128);
    generator.maximumSize = maxSize;
    [generator generateCGImagesAsynchronouslyForTimes:[NSArray arrayWithObject:[NSValue valueWithCMTime:thumbTime]] completionHandler:handler];

}

希望这对您有所帮助。

于 2015-05-05T12:29:27.510 回答