UIImagePickerController миниатюра видео, которое забирается из библиотеки - PullRequest
22 голосов
/ 19 апреля 2011

Я пытаюсь получить миниатюру видео, которое берется из библиотеки с помощью 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];
    }
}

Ответы [ 4 ]

43 голосов
/ 09 мая 2011

У меня была полу-связанная проблема, и в итоге я отказался от использования 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];
15 голосов
/ 19 января 2015

Фреймворк AssetsLibrary имеет именно то, что вам нужно с классами ALAssetsLibrary и ALAsset.Этот код работает как для фотографий, так и для видео, и уменьшенное изображение точно такое же, как вы видите в средстве выбора.

- (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];
}

Обратите внимание, что в iOS 8 с альбомами Photo Stream есть ошибка, см. ALAssetsLibrary assetForURL: всегда возвращать ноль для фотографий в «My Photo Stream» в iOS 8.1 для обходного пути.

3 голосов
/ 27 апреля 2018
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
    }
}
3 голосов
/ 30 июня 2017

Swift 3.1

Я создал функцию класса и передал ваш URL в параметре

class func captureThumbnail(withVideoURL videoURL:URL,secs:Int,preferredTimeScale scale:Int,completionHandler:((UIImage?) ->Void)?) -> Void
{
    //let seconds : Int64 = 10
    // let preferredTimeScale : Int32 = 1

    DispatchQueue.global().async {

        do
        {
            let asset = AVURLAsset(url: videoURL)

            let imgGenerator = AVAssetImageGenerator(asset: asset)
            imgGenerator.appliesPreferredTrackTransform = true
            let cgImage = try imgGenerator.copyCGImage(at:CMTimeMake(Int64(secs), Int32(scale)),actualTime: nil)
            let thumbnail = UIImage(cgImage: cgImage)
            completionHandler?(thumbnail)
        }
        catch let error as NSError
        {
            print("Error generating thumbnail: \(error)")
            completionHandler?(nil)
        }
    }
}
...