iphone - AVCaptureSession 仅在 iPhone 3G 上返回空白图像

标签 iphone ios4 avcapturesession

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

Error: CGDataProviderCreateWithCopyOfData: vm_copy failed: status 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;

最佳答案

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;

关于iphone - AVCaptureSession 仅在 iPhone 3G 上返回空白图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3954952/

相关文章:

iphone - Mach API 是否公开可用于 iOS 应用程序?

objective-c - 如何检测 iPhone 上的 Grand Central Dispatch 功能支持?

ios - 使用 AVCaptureSession 捕获视频,使用 EAGLContext 没有可见输出

ios - iphone 4s 中的 AvCapture Session 全屏

ios - AVCaptureVideoPreviewLayer 正确显示,但在 iPhone6 上除外

iphone - arrayWithContentsOfFile 无法读取 plist 文件

java - 如何在 JavaMail 中发送带有嵌入式图像和常规附件的电子邮件?

iphone - xamarin studio (Monotouch) 中出现错误 MT2002

模拟器 : llvm-gcc-4. 2 的 iPhone 应用程序编译失败,退出代码为 255

iphone - 在 iOS4.1 上保存带有照片的地理标签信息