2012-01-22 71 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