【问题标题】:Generating video thumbnails of all videos from gallery gives memory issues从图库中生成所有视频的视频缩略图会导致内存问题
【发布时间】:2016-06-03 14:11:29
【问题描述】:

我正在开发一个应用程序,我需要在其中显示我的画廊中所有视频的缩略图(作为集合视图查看)。现在我正在使用 AVAssetImageGenerator 从画廊中的视频生成缩略图,但我遇到了内存问题。这是我正在使用的代码:

    PHFetchResult *fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeVideo options:nil];

    PHImageManager *imageManager = [PHImageManager new];

    for(NSInteger i=0 ; i < fetchResult.count ; i++){

     __weak SAVideosViewController *weakSelf = self;
        [imageManager requestAVAssetForVideo:fetchResult[i] options:nil resultHandler:^(AVAsset * _Nullable asset, AVAudioMix * _Nullable audioMix, NSDictionary * _Nullable info) {

            [collectionViewData addObject:asset];
//my method to generate video thumbnail...
            [self generateThumbnailForAsset:asset];

            if(i == fetchResult.count-1){

                collectionViewDataFilled = YES;

                 dispatch_async(dispatch_get_main_queue(), ^{

                    [weakSelf.myCollectionView reloadData];
                });

            }
        }];
    }

这是上面调用的方法:

    -(void)generateThumbnailForAsset:(AVAsset*)asset_{

AVAssetImageGenerator *imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset_];
    CMTime time = CMTimeMakeWithSeconds(1,1);
    CMTimeShow(time);
    CGImageRef img = [imageGenerator copyCGImageAtTime:time  actualTime:NULL error:NULL];

if(img != nil){
    NSLog(@"image");
    [thumbnails addObject:[UIImage imageWithCGImage:img]];
}

CGImageRelease(img);

}

我想知道为什么会出现内存问题以及如何解决。

【问题讨论】:

    标签: ios gallery video-thumbnails avassetimagegenerator


    【解决方案1】:

    似乎没有人知道正确答案。所以在这里我在经过一些研究后回答我自己的问题。

    注意:要做到这一点,您不需要使用 AVAssetImageGenerator。您可以使用以下方法(PHOTOS FRAMEWORK)。

    PHCachingImageManager *cachingImageManager;
    
    [cachingImageManager startCachingImagesForAssets:collectionViewData targetSize:cellSize contentMode:PHImageContentModeAspectFill options:nil];
    

    这里使用的类是 PHCachingImageManager。在苹果文档中阅读这个。

    然后在此之后,使用第二种方法从缓存中检索数据。

        [cachingImageManager requestImageForAsset:collectionViewData[indexPath.row] targetSize:AssetGridThumbnailSize contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
    
            cell.myImageView.image = result;
        }];
    

    回调处理程序提供了一个图像,您可以在您的集合查看单元格中使用它。在 cellForItemAtIndexPath 方法中使用它。

    完整的代码和参考,参考APPLE的这个例子。 https://developer.apple.com/library/ios/samplecode/UsingPhotosFramework/Introduction/Intro.html

    【讨论】:

      猜你喜欢
      • 2017-03-01
      • 2012-09-01
      • 1970-01-01
      • 2013-10-22
      • 2011-07-04
      • 2011-02-19
      • 2010-12-27
      • 2017-10-14
      • 1970-01-01
      相关资源
      最近更新 更多