我们如何修复下面的代码,以便从我们传入的sampleBuffer中为您在下面看到的图像正确着色?
我们正在尝试将传入的sampleBuffer图像转换为UIImage,但结果是您在下面看到的反色背景图像。
您可以看到我们尝试在代码中使用kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange选项 - 但结果是相同的。
我们试图显示的传入图像具有所有正确的颜色,如果我们将图像渲染到GLKView中,所有颜色都在那里。
这可能是YUV420转换问题吗?
以下是我们使用的转换代码:
- (CGImageRef) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer // Create a CGImageRef from sample buffer data
{
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer,0); // Lock the image buffer
uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0); // Get information of the image
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
// CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange | kCGImageAlphaPremultipliedFirst);
CGImageRef newImage = CGBitmapContextCreateImage(newContext);
CGContextRelease(newContext);
CGColorSpaceRelease(colorSpace);
CVPixelBufferUnlockBaseAddress(imageBuffer,0);
/* CVBufferRelease(imageBuffer); */ // do not call this!
return newImage;
}
以下是我们用于传入CVPixelBuffer的设置代码:
// Now create the CVPixelBuffer to which we will render
CVReturn retVal = CVPixelBufferCreate(kCFAllocatorDefault,
self.screenWidth,
self.screenHeight,
kCVPixelFormatType_32BGRA,
attrs,
&_outputRenderTarget);
有关尝试恢复和显示所有正确颜色的建议吗?
答案 0 :(得分:0)
除了您需要换回注释/未注释的行之外,显示的代码没有问题。
我会后退一步,查看将数据写入传入缓冲区的内容。例如,我使用AVAssetReaderVideoCompositionOutput对象来生成样本缓冲区。视频合成对象的初始化具有与用于创建传入cvpixelbuffer以及cgimage和位图兼容性密钥的视频设置相匹配。
答案 1 :(得分:0)
事实证明我们用1-r,1-g,1-b反转所有颜色。
一旦我们移除了反转,颜色再次显示正常。