UIImagePickerController从图书馆接收的视频缩略图

Gar*_*mal 23 video thumbnails uiimagepickercontroller

我正在尝试使用UIImagePickerController获取从库中拾取的视频的缩略图.

这是我的代码.如果我使用相机录制视频,我可以获得视频的缩略图.但是如果我从图书馆中获取视频,我就无法获得缩略图.谁知道为什么?

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];

    if ([mediaType isEqualToString:(NSString *)kUTTypeMovie])
    {
        NSURL *mediaUrl = [info objectForKey:UIImagePickerControllerMediaURL];

        MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:mediaUrl];
        moviePlayer.shouldAutoplay = NO;
        UIImage *thumbnail = [[moviePlayer thumbnailImageAtTime:0.0 timeOption:MPMovieTimeOptionNearestKeyFrame] retain];
        [imageView setImage:thumbnail];  //imageView is a UIImageView

        [moviePlayer release];
        [thumbnail release];
        [self dismissModalViewControllerAnimated:YES];
    }
}
Run Code Online (Sandbox Code Playgroud)

mob*_*abo 43

我有一个半相关的问题,最终放弃使用MPMoviePlayer生成缩略图.请尝试使用AVAssetImageGenerator.Apple讨论了使用AVAssetImageGenerator在这里创建缩略图.这是我自己的示例代码,它抓取单个缩略图图像.您需要包含AVFoundation框架.

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:vidPath options:nil];
AVAssetImageGenerator *gen = [[AVAssetImageGenerator alloc] initWithAsset:asset];
gen.appliesPreferredTrackTransform = YES;
CMTime time = CMTimeMakeWithSeconds(0.0, 600);
NSError *error = nil;
CMTime actualTime;

CGImageRef image = [gen copyCGImageAtTime:time actualTime:&actualTime error:&error];
UIImage *thumb = [[UIImage alloc] initWithCGImage:image];
CGImageRelease(image);
[gen release];
Run Code Online (Sandbox Code Playgroud)


0xc*_*ced 15

AssetsLibrary框架有正是你需要用什么ALAssetsLibraryALAsset类.此代码适用于照片和视频以及缩略图,与您在选择器中看到的完全相同.

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    [[ALAssetsLibrary new] assetForURL:info[UIImagePickerControllerReferenceURL] resultBlock:^(ALAsset *asset) {
        imageView.image = [UIImage imageWithCGImage:asset.thumbnail];
    } failureBlock:^(NSError *error) {
        // handle error
    }];
    [self dismissViewControllerAnimated:YES completion:nil];
}
Run Code Online (Sandbox Code Playgroud)

请注意,iOS 8上有Photo Stream相册存在错误,请参阅ALAssetsLibrary assetForURL:对于iOS 8.1中的"我的照片流"中的照片,总是返回nil以获得解决方法.


Jos*_*nor 7

func videoSnapshot(filePathLocal:URL) -> UIImage? {
    do
    {
        let asset = AVURLAsset(url: filePathLocal)
        let imgGenerator = AVAssetImageGenerator(asset: asset)
        imgGenerator.appliesPreferredTrackTransform = true
        let cgImage = try imgGenerator.copyCGImage(at:CMTimeMake(Int64(0), Int32(1)),actualTime: nil)
        let thumbnail = UIImage(cgImage: cgImage)
        return thumbnail
    }
    catch let error as NSError
    {
        print("Error generating thumbnail: \(error)")
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)


Sid*_*war 6

斯威夫特 5及以上

func thumbnailForVideo(url: URL) -> UIImage? {
    let asset = AVAsset(url: url)
    let assetImageGenerator = AVAssetImageGenerator(asset: asset)
    assetImageGenerator.appliesPreferredTrackTransform = true

    var time = asset.duration
    time.value = min(time.value, 2)

    do {
        let imageRef = try assetImageGenerator.copyCGImage(at: time, actualTime: nil)
        return UIImage(cgImage: imageRef)
    } catch {
        print("failed to create thumbnail")
        return nil
    }
}
Run Code Online (Sandbox Code Playgroud)