我有CMSampleBufferRef(s),我使用VTDecompressionSessionDecodeFrame进行解码,在完成帧解码后会导致CVImageBufferRef,所以我的问题是..
在UIView中显示这些CVImageBufferRefs的最有效方法是什么?
我已成功将CVImageBufferRef转换为CGImageRef并通过将CGImageRef设置为CALayer的内容进行显示,但随后DecompressionSession已配置为@ {(id)kCVPixelBufferPixelFormatTypeKey:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA]};
这是示例/代码,我是如何将CVImageBufferRef转换为CGImageRef的(注意:cvpixelbuffer数据必须为32BGRA格式才能起作用)
CVPixelBufferLockBaseAddress(cvImageBuffer,0);
// get image properties
uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(cvImageBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(cvImageBuffer);
size_t width = CVPixelBufferGetWidth(cvImageBuffer);
size_t height = CVPixelBufferGetHeight(cvImageBuffer);
/*Create a CGImageRef from the CVImageBufferRef*/
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef cgContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
CGImageRef cgImage = CGBitmapContextCreateImage(cgContext);
// release context and colorspace
CGContextRelease(cgContext);
CGColorSpaceRelease(colorSpace);
// now CGImageRef can be displayed either by setting CALayer content
// or by creating a [UIImage withCGImage:geImage] that can be displayed on
// UIImageView ...
#WWDC14 session 513(https://developer.apple.com/videos/wwdc/2014/#513)暗示可以避免YUV-> RGB色彩空间转换(使用CPU?),并且是否使用了YUV兼容的GLES魔术-想知道这将是什么,以及如何实现?
Apple的iOS SampleCode GLCameraRipple展示了一个示例,该示例显示了使用2个OpenGLES从相机捕获的YUV CVPixelBufferRef,其中两个Y和UV分量具有单独的纹理,而片段着色器程序使用GPU进行YUV到RGB色彩空间的转换计算-真正需要的全部就是还有一些更简单的方法可以做到这一点吗?
注意:在我的用例中,由于无法使用解压缩输入,因此我无法使用AVSampleBufferDisplayLayer。
最佳答案
更新:以下原始答案无效,因为kCVPixelBufferIOSurfaceCoreAnimationCompatibilityKey
对iOS不可用。UIView
由CALayer
支持,其contents
属性支持多种类型的图像。如my answer所述,针对macOS的类似问题,可以使用CALayer
呈现CVPixelBuffer
的后缀IOSurface
。 (注意:我仅在macOS上对此进行了测试。)
关于ios - 在iOS上显示CVImageBufferRef的最有效方法是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32850012/