使用ALAssetLibrary

时间:2016-04-18 04:51:42

标签: ios video

我希望使用ALAssetLibrary显示视频缩略图,并将图片中的视频显示到我的应用中,我过滤了ALAssetsFilter中的所有视频。

但我仍然在ALAsset类型的资产中获得空值。

请告诉我我的代码出错了。

感谢您的帮助。

-(void)loadAssets{
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {

    [group setAssetsFilter:[ALAssetsFilter allVideos]];
    [group enumerateAssetsWithOptions:NSEnumerationReverse usingBlock:^(ALAsset *asset, NSUInteger index, BOOL *innerStop) {
              if (asset)
              {
                  dic = [[NSMutableDictionary alloc] init];
                  ALAssetRepresentation *defaultRepresentation = [asset defaultRepresentation];
                  NSString *uti = [defaultRepresentation UTI];
                  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:asset];

              }
          }];
         [_collectionView reloadData];
     }

failureBlock:^(NSError *error)
{
    NSLog(@"error enumerating AssetLibrary groups %@\n", error);
}];
}

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

UIImage *image = nil;
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:@"ImageThumbnail"];//kImage
    NSLog(@"Values of dictonary==>%@", dic);
    NSLog(@"Videos Are:%@",allVideos);
    CGImageRelease(halfWayImage);
}
return image;
}

2 个答案:

答案 0 :(得分:1)

使用此代码可能会帮助您生成缩略图 - -

-(UIImage*)loadImage {



    AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:self.videoURL options:nil];



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



    generate.appliesPreferredTrackTransform = YES;



    NSError *err = NULL;



    CMTime time = CMTimeMake(1, 60);



    CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err];



    return [[UIImage alloc] initWithCGImage:imgRef];



}

答案 1 :(得分:0)

我有从视频创建缩略图图像,它为我工作,代码在下面,

NSURL *videoURL = [info objectForKey:UIImagePickerControllerMediaURL];
            NSLog(@"store url %@",videoURL);
AVAsset *avAsset = [AVURLAsset URLAssetWithURL:videoURL options:nil];

            if ([[avAsset tracksWithMediaType:AVMediaTypeVideo] count] > 0)
            {
                AVAssetImageGenerator *imageGenerator =[AVAssetImageGenerator assetImageGeneratorWithAsset:avAsset];
                Float64 durationSeconds = CMTimeGetSeconds([avAsset duration]);
                CMTime midpoint = CMTimeMakeWithSeconds(durationSeconds/2.0, 600);
                NSError *error;
                CMTime actualTime;


                CGImageRef halfWayImage = [imageGenerator copyCGImageAtTime:kCMTimeZero actualTime:&actualTime error:&error];


                if (halfWayImage != NULL)
                {

                    NSString *actualTimeString = (NSString *)CFBridgingRelease(CMTimeCopyDescription(NULL, actualTime));
                    NSString *requestedTimeString = (NSString *)CFBridgingRelease(CMTimeCopyDescription(NULL, midpoint));
                    NSLog(@"Got halfWayImage: Asked for %@, got %@", requestedTimeString, actualTimeString);

                    UIImage *img=[UIImage imageWithCGImage:halfWayImage];

                    playButton.hidden=NO;
                    self.myimageView.image= img; //[self scaleImage:img maxWidth:(img.size.width/5) maxHeight:(img.size.height/5)];

                }

            }

终于得到了缩略图,希望它有用