在iOS上显示CVImageBufferRef的最有效方法是什么?

时间:2015-09-29 17:16:40

标签: ios opengl-es core-graphics avfoundation video-toolbox

我有CMSampleBufferRef(s),我使用VTDecompressionSessionDecodeFrame解码,在帧的解码完成后导致CVImageBufferRef,所以我的问题是......

在UIView中显示这些CVImageBufferRefs的最有效方法是什么?

我已成功将CVImageBufferRef转换为CGImageRef并通过设置CGImageRef将其显示为CALayer的内容,但后来DecompressionSession已配置为@ {(id)kCVPixelBufferPixelFormatTypeKey:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA]};

以下是我将CVImageBufferRef转换为CGImageRef的示例/代码(注意:cvpixelbuffer数据必须采用32BGRA格式才能生效)

bytearray

#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,因为实际上解压缩的输入是如何可用的。

2 个答案:

答案 0 :(得分:0)

如果您从[{1}}获得了CVImageBufferRef CMSampleBufferRef,则不需要进行转换,也可以直接从中获取imageData captureOutput:didOutputSampleBuffer:fromConnection:。这是代码:

CMSampleBufferRef

API描述不提供有关其32BGRA支持与否的任何信息,并以NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:sampleBuffer]; UIImage *frameImage = [UIImage imageWithData:imageData]; 格式生成imageData以及任何元数据,而不应用任何压缩。如果您的目标是在屏幕上显示图片或与jpeg一起使用,这是一种快捷方式。

答案 1 :(得分:0)

更新:下面的原始答案不起作用,因为kCVPixelBufferIOSurfaceCoreAnimationCompatibilityKey在iOS上不可用。


UIViewCALayer属性支持多种图像的contents支持。如my answer所述,关于macOS的类似问题,可以使用CALayer来呈现CVPixelBuffer的后盾IOSurface。 (注意:我仅在macOS上对此进行了测试。)

相关问题