2010-11-28 23 views
16

मैं एवीप्लेयर के साथ एक वीडियो चलाता हूं। यह ठीक काम करता है।एवीप्लेयर से जुड़े कैलियर से यूआईएममेज प्राप्त करें (वीडियो प्लेइंग से फ्रेम निकालें)

अब मैं वीडियो खेलने से UIImage प्राप्त करना चाहता हूं (जब मैं इस पल के लिए बटन दबाता हूं)।

मेरे AVPlayer से जुड़ा हुआ CALayer है जिसका उपयोग मेरे UIView पर वीडियो प्रदर्शित करने के लिए किया जाता है। मेरा विचार वीडियो के दौरान CALayer से UIImage प्राप्त करना है।

मैं एक और सवाल से कोड के साथ ऐसा कर:

UIImage from CALayer - iPhone SDK

हालांकि मेरी UIImage खाली है। संकल्प अच्छा है लेकिन यह पूरी तरह से सफेद है !!!

ऐसा लगता है कि वीडियो मेरे CALayer की सामग्री नहीं लिखता है।

कोई मेरी मदद कर सकता है? धन्यवाद

+2

क्या हम उस कोड को देख सकते हैं जो छवि बनाने के लिए विधि को आमंत्रित करता है? –

उत्तर

1

कोशिश AVAssetImageGenerator का उपयोग कर निर्दिष्ट कहने पर वीडियो फ़ाइल से चित्र प्राप्त करने के लिए:

 
    AVURLAsset *asset=[[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:[info objectForKey:@"UIImagePickerControllerReferenceURL"]] options:nil]; 
    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
    generator.appliesPreferredTrackTransform=TRUE; 
    [asset release]; 
    CMTime thumbTime = CMTimeMakeWithSeconds(0,30); 
    AVAssetImageGeneratorCompletionHandler handler = ^(CMTime requestedTime, CGImageRef im, CMTime actualTime, AVAssetImageGeneratorResult result, NSError *error){ 
    if (result != AVAssetImageGeneratorSucceeded) { 

    } 
    UIImage *thumbImg = [[UIImage imageWithCGImage:im] retain]; 
    [generator release]; 
8

मैं मिलिए के समाधान मेरे लिए काम नहीं कर सकता है, लेकिन यह मुझे सही दिशा में सोच मिला ।

नीचे कोड है जो मैंने अपनी परियोजना में उपयोग किया है। विधि screenshotFromPlayer:maximumSize:AVPlayer का एक उदाहरण स्वीकार करता है जिसमें से स्क्रीनशॉट लेने के लिए, और CGSize जो लौटाई गई छवि का अधिकतम आकार होगा।

- (UIImage *)screenshotFromPlayer:(AVPlayer *)player maximumSize:(CGSize)maxSize { 

    CMTime actualTime; 
    NSError *error; 

    AVAssetImageGenerator *generator = [[AVAssetImageGenerator alloc] initWithAsset:player.currentItem.asset]; 

    // Setting a maximum size is not necessary for this code to 
    // successfully get a screenshot, but it was useful for my project. 
    generator.maximumSize = maxSize; 

    CGImageRef cgIm = [generator copyCGImageAtTime:player.currentTime 
             actualTime:&actualTime 
              error:&error]; 
    UIImage *image = [UIImage imageWithCGImage:cgIm]; 
    CFRelease(cgIm); 

    if (nil != error) { 
     NSLog(@"Error making screenshot: %@", [error localizedDescription]); 
     NSLog(@"Actual screenshot time: %f Requested screenshot time: %f", CMTimeGetSeconds(actualTime), 
      CMTimeGetSeconds(self.recordPlayer.currentTime)); 
     return nil; 
    } 

    return image; 
} 

भी ध्यान रखें कि एक अतुल्यकालिक रूप से छवि पीढ़ी प्रदर्शन करने के लिए (AVAssetImageGenerator के कहने पर) विधि generateCGImagesAsynchronouslyForTimes:completionHandler: बजाय copyCGImageAtTime:actualTime:error: इस्तेमाल कर सकते हैं।

यह कोड नमूना AVPlayer के currentTime पर एक स्क्रीनशॉट उत्पन्न करता है, लेकिन इसके बजाय किसी भी समय इसका उपयोग किया जा सकता है।

+2

मुझे पता है कि यह बहुत पुराना है लेकिन अब किसी के लिए जो आता है, सुनिश्चित करें कि आपके पास वास्तव में रिलीज होने से पहले CGImageRef है। यदि आप नहीं करते हैं, जो निश्चित रूप से हो सकता है, तो ऐप क्रैश हो जाएगा। –

8

AVplayer से छवि प्राप्त करने के लिए कोड।

- (UIImage *)currentItemScreenShot 
{ 
    AVPlayer *abovePlayer = [abovePlayerView player]; 
    CMTime time = [[abovePlayer currentItem] currentTime]; 
    AVAsset *asset = [[[abovePlayerView player] currentItem] asset]; 
    AVAssetImageGenerator *imageGenerator = [[AVAssetImageGenerator alloc] initWithAsset:asset]; 
    if ([imageGenerator respondsToSelector:@selector(setRequestedTimeToleranceBefore:)] && [imageGenerator respondsToSelector:@selector(setRequestedTimeToleranceAfter:)]) { 
     [imageGenerator setRequestedTimeToleranceBefore:kCMTimeZero]; 
     [imageGenerator setRequestedTimeToleranceAfter:kCMTimeZero]; 
    } 
    CGImageRef imgRef = [imageGenerator copyCGImageAtTime:time 
              actualTime:NULL 
               error:NULL]; 
    if (imgRef == nil) { 
     if ([imageGenerator respondsToSelector:@selector(setRequestedTimeToleranceBefore:)] && [imageGenerator respondsToSelector:@selector(setRequestedTimeToleranceAfter:)]) { 
      [imageGenerator setRequestedTimeToleranceBefore:kCMTimePositiveInfinity]; 
      [imageGenerator setRequestedTimeToleranceAfter:kCMTimePositiveInfinity]; 
     } 
     imgRef = [imageGenerator copyCGImageAtTime:time actualTime:NULL error:NULL]; 
    } 
    UIImage *image = [[UIImage alloc] initWithCGImage:imgRef]; 
    CGImageRelease(imgRef); 
    [imageGenerator release]; 

    return [image autorelease]; 
} 

[imageGenerator setRequestedTimeToleranceBefore:kCMTimeZero] और [imageGenerator setRequestedTimeToleranceAfter:kCMTimeZero] सेट यदि आप सटीक समय की जरूरत है।

संबंधित मुद्दे