首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IOS5: UIView转换为视频,生成的视频已损坏

IOS5: UIView转换为视频,生成的视频已损坏
EN

Stack Overflow用户
提问于 2012-01-23 05:06:05
回答 1查看 860关注 0票数 1

我想抓取UIView,转换为图像,然后将该图像存储在视频文件(.mp4)中。我使用下一部分代码来抓取图像并将其放入像素缓冲区:

代码语言:javascript
复制
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 );
    }

问题是,生成的视频包含损坏的图像-所有像素都偏移了。看起来内存中充满了带有偏移量的字节,而偏移量会破坏表示。

如何解决这个问题?我想要任何胶水或方向。提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2012-01-23 05:16:11

这看起来很可疑:

代码语言:javascript
复制
CGContextRef context = CGBitmapContextCreate(pxdata, imgsize.width,
    imgsize.height, 8, 4*imgsize.width, rgbColorSpace, 
    kCGImageAlphaNoneSkipFirst);

您将根据图像宽度计算bytesPerRow参数,而不是询问pxbuffer的每行字节数。试试这个:

代码语言:javascript
复制
CGContextRef context = CGBitmapContextCreate(pxdata, imgsize.width,
    imgsize.height, 8, CVPixelBufferGetBytesPerRow(pxbuffer),
    rgbColorSpace, kCGImageAlphaNoneSkipFirst);

此外,使用UIGraphicsGetCurrentContext创建位图图形上下文,将层渲染到上下文中,从上下文中获取图像,销毁上下文,创建像素缓冲区,使用像素缓冲区创建位图图形上下文,并将层的图像绘制到新上下文中,似乎效率低下。为什么不用[self.imageSource.layer renderInContext:context]替换你的CGContextDrawImage调用呢

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8964695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档