2012-01-22 72 views
1

我想抓住UIView,轉換爲圖像,並將該圖像存儲在視頻文件(.mp4)中。 我使用哪個抓住圖像並將其用於像素緩衝器的代碼的下部分:IOS 5:UIView轉換爲視頻並導致視頻損壞

BOOL appended; 
    if(input.readyForMoreMediaData==YES){ 
     //grab the view and convert it into image 
     CGSize imgsize=self.imageSource.frame.size; 
     UIGraphicsBeginImageContext(imgsize); 
     [self.imageSource.layer renderInContext:UIGraphicsGetCurrentContext()]; 
     UIImage* grabbedImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

     CVReturn cvErr = kCVReturnSuccess; 
     CGImageRef image = (CGImageRef) [grabbedImage CGImage]; 

     NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithBool:YES], kCVPixelBufferCGImageCompatibilityKey, 
           [NSNumber numberWithBool:YES], kCVPixelBufferCGBitmapContextCompatibilityKey, 
           nil]; 
     CVPixelBufferRef pxbuffer = NULL; 

     CVReturn status = CVPixelBufferCreate(kCFAllocatorDefault, imgsize.width, 
               imgsize.height, kCVPixelFormatType_32ARGB, (__bridge CFDictionaryRef) options, 
               &pxbuffer); 

     NSParameterAssert(status == kCVReturnSuccess && pxbuffer != NULL); 

     CVPixelBufferLockBaseAddress(pxbuffer, 0); 
     void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer); 
     NSParameterAssert(pxdata != NULL); 

     CGColorSpaceRef rgbColorSpace = CGColorSpaceCreateDeviceRGB(); 
     CGContextRef context = CGBitmapContextCreate(pxdata, imgsize.width, 
                imgsize.height, 8, 4*imgsize.width, rgbColorSpace, 
                kCGImageAlphaNoneSkipFirst); 
     NSParameterAssert(context); 
     CGContextConcatCTM(context, CGAffineTransformMakeRotation(0)); 
     CGContextDrawImage(context, CGRectMake(0, 0, CGImageGetWidth(image), 
               CGImageGetHeight(image)), image); 
     CGColorSpaceRelease(rgbColorSpace); 
     CGContextRelease(context); 

     CVPixelBufferUnlockBaseAddress(pxbuffer, 0); 

     appended = [pxlBufAdaptor appendPixelBuffer:pxbuffer withPresentationTime:presentationTime]; 
     CVBufferRelease(pxbuffer); 
    } 

的問題是,所得到的視頻包含損壞圖像 - 所有像素都被抵消。它看起來像內存填充字節與一些偏移量和該偏移損壞了演示文稿。

這怎麼解決? 我想要任何膠水或方向。 在此先感謝。

回答

3

這看起來可疑:

CGContextRef context = CGBitmapContextCreate(pxdata, imgsize.width, 
    imgsize.height, 8, 4*imgsize.width, rgbColorSpace, 
    kCGImageAlphaNoneSkipFirst); 

您計算基於圖像寬度bytesPerRow參數,而不是要求pxbuffer其字節,每行。試試這個:

CGContextRef context = CGBitmapContextCreate(pxdata, imgsize.width, 
    imgsize.height, 8, CVPixelBufferGetBytesPerRow(pxbuffer), 
    rgbColorSpace, kCGImageAlphaNoneSkipFirst); 

而且,它似乎沒有效率的創建位圖圖形上下文與UIGraphicsGetCurrentContext,圖層渲染成的背景下,從上下文得到的圖像,破壞的背景下,創建一個像素緩衝區,創建位圖使用像素緩衝區的圖形上下文,並將圖層的圖像繪製到新的上下文中。爲什麼不用[self.imageSource.layer renderInContext:context]替換你的CGContextDrawImage電話?

+0

好吧,幫助 – Tony

+0

好吧,我試着用[self.imageSource.layer renderInContext:context]。但是,有問題 - 圖像顛倒了。 – Tony