2011-04-19 26 views
21

UIImagePickerController kullanarak kütüphaneden alınan videonun küçük resmini almaya çalışıyorum.UIImagePickerController kütüphaneden alınan videonun küçük resmi

İşte kodum. Bir video kaydederken kamerayı kullanırsam videonun küçük resmini alabilirim. Ama kütüphaneden bir video alırsam küçük resmi alamıyorum. Nedenini bilen var mı?

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

Biri bana yardımcı olabilir geçmek var? – Gargamal

cevap

40

Yarıyla ilgili bir sorun yaşadım ve sonunda küçük resimler oluşturmak için MPMoviePlayer kullanarak vazgeçtim. Bunun yerine AVAssetImageGenerator kullanmayı deneyin. Apple, here minik resimlerini oluşturmak için AVAssetImageGenerator kullanarak tartışıyor. İşte tek bir küçük resmi yakalayan kendi örnek kodum. AVFoundation çerçevesini dahil etmeniz gerekecek.

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]; 
+10

ayrıca CoreMedia – ArunGJ

14

AssetsLibrary çerçeve sen ALAssetsLibrary ve ALAsset sınıfları ile gerekenleri tam olarak vardır. Bu kod hem fotoğraflar hem de videolar için çalışır ve küçük resim, seçicide gördüğünüzle tam olarak aynıdır. Geçici bir çözüm için ALAssetsLibrary assetForURL: always returning nil for photos in “My Photo Stream” in iOS 8.1 bkz Fotoğraf Yayını Albümlerle iOS 8 kaynaklı bir hata olduğunu

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

Not. Swift

+0

çerçevesini de ekler. IOS 8 ve daha yeni sürümlerinde, Apple [Fotoğraflar çerçevesi] kullanılmasını önerir (https://developer.apple.com/library/prerelease/ios/documentation/Photos/Reference/Photos_Framework/index.html# // apple_ref/doc/uid/TP40014408) ALAssetsLibrary yerine. Bu, 'saymaGrupsWithTypes: kullanarakBlock: 'geri düşmekten daha iyi bir yaklaşım olacaktır. –

+0

Bence bu yorum, bağlantılı soruya aittir. – 0xced

+0

i Aynı şeyi Swift3'te yapmanız gerekiyor ... –

0

3,1

Bir sınıf işlevi oluşturmak ve param da 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) 
     } 
    } 
} 
İlgili konular