不明原因的崩溃产生视频

时间:2012-01-22 20:36:24

标签: ios multithreading ios5 core-graphics

我为iPad开发了一些应用程序,包括媒体捕获和导出。代码包含以下部分:

BOOL appended;
    if(input.readyForMoreMediaData==YES){
        //CVPixelBufferRef videobuf=[self pixelBufferFromCGImage];
        //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 );
    }

此代码中的任何更正几乎都会使应用程序崩溃:

/ SourceCache / CoreMediaH264SWLib_Sim / CoreMediaH264SWLib-407 / Standalone /../ JVTLib_Turbo / JVTLib.cpp

中的#10597行中的SetErrAndBail()

然而,在Clean + Rebuild之后,执行相同的代码而不会崩溃。

如何消除崩溃?

1 个答案:

答案 0 :(得分:0)

由于系统内存不足,您正在崩溃。创建一个像素缓冲池并重用像素缓冲区,而不是每次只创建一个缓冲池,崩溃可能会消失。您还应该使用BGRA格式像素而不是ARGB格式像素,以避免系统在幕后进行字节交换。

相关问题