2014-06-14 77 views
1

我試圖從GPUImage捕獲的視頻幀生成UIImage。我做了很多AVFoundation視頻工作,但我是新手使用GPUImage。我已經subclassedGPUImageVideoCamera並增加了這種方法,但UIImage總是零。如果任何人都可以告訴我我哪裏去了這麼可怕的錯誤,我會非常感激!從GPUImage視頻幀生成UIImage

- (void)processVideoSampleBuffer:(CMSampleBufferRef)sampleBuffer 

{ [超級processVideoSampleBuffer:sampleBuffer]; //讓GPUImage做它的處理第一

if (!self.thumbnailGenerated) 
{ 
    CMTime timestamp = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); 
    NSLog(@"%f", (float)timestamp.value/timestamp.timescale); 

    self.thumbnailGenerated = YES; 

    dispatch_sync(dispatch_get_main_queue(),^
        { 
         // generate a preview frame from the last filter in the camera filter chain 

         UIImage *thumbnailImage = [UIImage imageWithCGImage:[[self.targets lastObject] newCGImageFromCurrentlyProcessedOutput]]; 
         NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Thumbnail.png"]; 
         [UIImagePNGRepresentation(thumbnailImage) writeToFile:pathToMovie atomically:YES]; 
        }); 
} 
} 

回答

0

我用這個代碼來生成第一幀的CGImageRef,使用縮略圖

AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:videoURl options:nil]; 
AVAssetImageGenerator *imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset]; 
[imageGenerator setAppliesPreferredTrackTransform:YES]; 
NSData *videoData = [NSData dataWithContentsOfURL:asset.URL]; 
CGImageRef image = [imageGenerator copyCGImageAtTime:kCMTimeZero actualTime:nil error:&error]; 

你可以用一些實際的值替換kCMTimeZero得到你想要的框架。

之後,您必須將您的CGImageRef轉換爲UIImage

+0

雖然這是理解的,有幾個問題,使得它不適合我在做什麼: 1.工作GPUImage之外,因此它不包括GPU過濾器/處理。 2.指定一個時間導致AVAssetImageGenerator從一開始就尋找AVURLAsset的媒體,即指定接近長視頻結束的時間比指定接近開始的時間花費更長的時間。 3.我已經得到了CMSampleBufferRef,並且 - 大概--GPUImage已經應用了超級調用的過濾器。 我很欣賞提示,這不是我要找的。 –

0

我不確定這是否有任何幫助,但我在處理視頻時得到縮略圖。爲此我使用

videoInput --> someMyOperations --> fileOutput 
someMyOperations --> imageOutput //imageOutput is PictureOutput() 
videoInput.start() //that needs to be called! 
imageOutput.saveNextFrameToUrl(coverUrl, format: .jpg) { file in 
    //here goes the code what to do with thumbnail 
    videoInput.cancel() //quite probably here you want this 
} 

這是猜測 - 我沒有看到你的代碼,但對我來說這工作。