【问题标题】:AVCaptureSession returning blank image on iPhone 3G onlyAVCaptureSession 仅在 iPhone 3G 上返回空白图像
【发布时间】:2010-10-17 19:44:59
【问题描述】:

我正在使用 Apple 的 AVCaptureSession 示例代码,而创建的 UIImage 是完全空白的。这只发生在 iPhone 3G 上,并在控制台上显示一个独特的错误,上面写着 -

错误:CGDataProviderCreateWithCopyOfData:vm_copy 失败:状态 2。

我在网上研究了错误,发现了这个StackOverflow answer,它消除了错误......但图像仍然是空白的。

有其他人经历过这种情况并知道如何解决吗?

提前致谢。

我的代码 -

CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
CVPixelBufferLockBaseAddress(imageBuffer, 0); 

void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer); 
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
size_t width = CVPixelBufferGetWidth(imageBuffer); 
size_t height = CVPixelBufferGetHeight(imageBuffer); 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 
CGImageRef quartzImage = CGBitmapContextCreateImage(context); 
CVPixelBufferUnlockBaseAddress(imageBuffer,0);

CGContextRelease(context); 
CGColorSpaceRelease(colorSpace);

UIImage *image = [UIImage imageWithCGImage:quartzImage];

CGImageRelease(quartzImage);

return image;

【问题讨论】:

    标签: iphone ios4 avcapturesession


    【解决方案1】:

    API 中有一些时髦的东西,所以我正在使用的解决方法是:

    //void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);     
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);     
    size_t width = CVPixelBufferGetWidth(imageBuffer);     
    size_t height = CVPixelBufferGetHeight(imageBuffer);     
    
    // vm_copy fails on older model phones...    
    //    
    uint8_t *baseAddress = malloc( bytesPerRow * height );    
    memcpy( baseAddress, CVPixelBufferGetBaseAddress(imageBuffer), bytesPerRow * height );
    
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();     
    
    // NO ALPHA CHANNEL ON OLDER MODELS    
    // CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);     
    CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaNoneSkipFirst);     
    CGImageRef quartzImage = CGBitmapContextCreateImage(context);     
    
    CVPixelBufferUnlockBaseAddress(imageBuffer,0);    
    CGContextRelease(context);     
    CGColorSpaceRelease(colorSpace);    
    free( baseAddress );
    
    UIImage *image = [UIImage imageWithCGImage:quartzImage];    
    CGImageRelease(quartzImage);
    
    return image;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-28
      • 2014-03-27
      • 2012-06-03
      • 1970-01-01
      • 2015-02-23
      • 2022-11-12
      • 2022-01-06
      • 1970-01-01
      相关资源
      最近更新 更多