Подтвердить что ты не робот

UIImagePickerController thumbnail видео, которое выбирается из библиотеки

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

Ответ 1

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

Ответ 2

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: всегда возвращает ноль для фотографий в "Мой фотопоток" в iOS 8.1 для обходной путь.

Ответ 3

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