【发布时间】:2015-09-29 17:16:39
【问题描述】:
我有 CMSampleBufferRef(s),我使用 VTDecompressionSessionDecodeFrame 解码,这会在帧解码完成后产生 CVImageBufferRef,所以我的问题是..
在 UIView 中显示这些 CVImageBufferRef 的最有效方式是什么?
我已成功将 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 会话 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,因为事实上解压缩的输入是可用的。
【问题讨论】:
标签: ios opengl-es core-graphics avfoundation video-toolbox