如何将视频从 ALAsset 显示到 UICollectionview ios

Posted

技术标签:

【中文标题】如何将视频从 ALAsset 显示到 UICollectionview ios【英文标题】:How to display video from ALAsset to UICollectionview ios 【发布时间】:2014-01-10 02:47:23 【问题描述】:

我尝试使用以下代码使用ALAsset 从照片库中获取所有视频。现在,我想将所有视频显示到UICollectionview,但它似乎没有显示任何内容。请给我一些建议。提前致谢。

-ViewDidLoad() : 从照片库中获取所有视频

allVideos = [[NSMutableArray alloc] init];
ALAssetsLibrary *assetLibrary = [[ALAssetsLibrary alloc] init];

[assetLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop)
 
     if (group)
     
         [group setAssetsFilter:[ALAssetsFilter allVideos]];
         [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop)
          
              if (asset)
              
                  dic = [[NSMutableDictionary alloc] init];
                  ALAssetRepresentation *defaultRepresentation = [asset defaultRepresentation];
                  NSString *uti = [defaultRepresentation UTI];
                  NSURL  *videoURL = [[asset valueForProperty:ALAssetPropertyURLs] valueForKey:uti];
                  NSString *title = [NSString stringWithFormat:@"video %d", arc4random()%100];
                  UIImage *image = [self imageFromVideoURL:videoURL];
                  [dic setValue:image forKey:@"image"];
                  [dic setValue:title forKey:@"name"];
                  [dic setValue:videoURL forKey:@"url"];
                  [allVideos addObject:dic];
                  [_collectionView reloadData];
              
          ];
     
 
 failureBlock:^(NSError *error)

    NSLog(@"error enumerating AssetLibrary groups %@\n", error);
];

-imageFromVideoURL():

    - (UIImage *)imageFromVideoURL:(NSURL*)videoURL

    // result
    UIImage *image = nil;

    // AVAssetImageGenerator
    AVAsset *asset = [[AVURLAsset alloc] initWithURL:videoURL options:nil];;
    AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset];
    imageGenerator.appliesPreferredTrackTransform = YES;

    // calc midpoint time of video
    Float64 durationSeconds = CMTimeGetSeconds([asset duration]);
    CMTime midpoint = CMTimeMakeWithSeconds(durationSeconds/2.0, 600);

    // get the image from
    NSError *error = nil;
    CMTime actualTime;
    CGImageRef halfWayImage = [imageGenerator copyCGImageAtTime:midpoint actualTime:&actualTime error:&error];

    if (halfWayImage != NULL)
    
        // CGImage to UIImage
        image = [[UIImage alloc] initWithCGImage:halfWayImage];
        [dic setValue:image forKey:@"name"];
         NSLog(@"Values of dictionary==>%@", dic);
        NSLog(@"Videos Are:%@",videoURL);
        CGImageRelease(halfWayImage);
    
    return image;

开始向 UICollectionView 显示视频的所有缩略图:

 - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section

    return allVideos.count;





 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    
        UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath];

        NSLog(@"allvideo %@", allVideos);
        ALAsset *alasset = [allVideos objectAtIndex:indexPath.row];

        return cell;
    

【问题讨论】:

【参考方案1】:

替换此行:-

              [allVideos addObject:dic];

              [allVideos addObject: asset];

在这个方法中:-

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
 
      UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath];

    NSLog(@"allvideo %@", allVideos);
    ALAsset *alasset = [allVideos objectAtIndex:indexPath.row];
    yourImageView.image = [UIImage imageWithCGImage:alasset.thumbnail];

 

【讨论】:

【参考方案2】:

首先从 ALAssetsGroupEnumerationResultsBlock(您传递给 -enumerateAssetsUsingBlock: 的块)中取出代码 [_collectionView reloadData],因为它会为找到的所有 AVAsset 调用 -reloadData

苹果提供了一个示例应用程序“MyImagePicker”,它可以执行您想做的确切事情。你可以从那里研究工作。

【讨论】:

谢谢,但如果将代码 [_collectionView reloadData] 从 ALAssetsGroupEnumerationResultsBlock 中取出,uicollectionview 不会显示视频缩略图。 在我的应用程序中,我在枚举块之后写了-reloadData,我发现它在块之后同步执行。此外,如果您在提供的链接上检查应用程序,苹果在-viewWillAppear-reloadData 中调用了枚举块-viewDidAppear 谢谢。我成功了,但现在我被困在获取视频的大小上。你能告诉我如何获取视频的大小吗? 您可以从ALAsset 获得ALAssetRepresentation,您可以在那里找到不同的选项来获取尺寸、尺寸等。 好的,谢谢。还有一件事:你知道在 uicollectionview 中取消选择时如何删除覆盖图像吗?我在选择时添加了叠加图像,现在我卡在滚动时,我的单元格自动刷新。我不希望它自动刷新。

以上是关于如何将视频从 ALAsset 显示到 UICollectionview ios的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ALASSET ios 获取视频大小

如何从 iOS 中的 ALAsset 获取视频的缩略图?

从 ALAsset 检索添加到库的日期?

如何使用 ALAsset URL 在 MPMoviePlayerController 上播放视频?

iOS 在 UITableView 中显示来自 ALAsset 的图像

ALAsset 中缺少视频文件缩略图时间戳