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

4 ответов


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

на AssetsLibrary framework имеет именно то, что вам нужно с 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: всегда возвращает ноль для фотографий в" моем фотопотоке " в iOS 8.1 для решения проблемы.


Swift 3.1

Я создал функцию класса и передаю Ваш url в param

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)
        }
    }
}

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
    }
}