CVPixelBuffer中的plane是什么?

7
CVPixelBuffer 对象中,有一个或多个平面。(参考) 我们有方法来获取平面的数量、高度和基地址。 那么平面到底是什么?它是如何在 CVPixelBuffer 中构建的呢?
示例:
<CVPixelBuffer 0x1465f8b30 width=1280 height=720 pixelFormat=420v iosurface=0x14a000008 planes=2>
    <Plane 0 width=1280 height=720 bytesPerRow=1280>
    <Plane 1 width=640 height=360 bytesPerRow=1280>
2个回答

15

视频格式是一个非常复杂的主题。

一些视频流以字节RGBA、ARGB、ABGR或其他几种变体(带或不带α通道)存储像素。

(在RGBA格式中,一个像素的红、绿、蓝和alpha值依次存储在内存中,后面跟着另一组4字节的颜色值,以此类推。)这是隔行扫描的颜色信息。

一些视频流将颜色通道分离开来,因此所有的红色通道、蓝色、绿色和alpha都作为单独的“平面”发送。如果包括alpha,则会得到一个包含所有红色信息的缓冲区,然后是所有蓝色数据,然后是所有绿色数据,然后是alpha。(想象一下彩色底片,其中有分别捕捉不同颜色的分离式感光层。感光层是颜色信息的平面。数字技术与此类似。)

还有一些格式,在这些格式中,颜色数据位于一个或两个平面中,然后亮度位于单独的平面中。这就是旧模拟彩色电视的工作原理。它最初是黑白的(亮度),然后广播公司添加了侧带信号来传输颜色信息。(色度)

我不经常深入研究CVPixelBuffer,所以不清楚您所问的细节,必须花费大量时间和大量的咖啡来启动我的大脑,才能理解这些血腥的细节。

编辑:

由于您的调试信息显示有两个平面,因此很可能该像素缓冲区具有亮度通道和色度通道,如@zeh的答案中所提到的。


2
尽管现有和被接受的答案在处理CVPixelBuffer时提供了重要信息,但在这种特定情况下,答案是错误的。问题所涉及的两个平面是亮度平面和色度平面。
“亮度”指亮度,“色度”指颜色 - 来自Quora
以下来自苹果的代码片段可以更清楚地说明:
let lumaBaseAddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 0)
let lumaWidth = CVPixelBufferGetWidthOfPlane(pixelBuffer, 0)
let lumaHeight = CVPixelBufferGetHeightOfPlane(pixelBuffer, 0)
let lumaRowBytes = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0)

var sourceLumaBuffer = vImage_Buffer(data: lumaBaseAddress,
                                     height: vImagePixelCount(lumaHeight),
                                     width: vImagePixelCount(lumaWidth),
                                     rowBytes: lumaRowBytes)

let chromaBaseAddress = CVPixelBufferGetBaseAddressOfPlane(pixelBuffer, 1)
let chromaWidth = CVPixelBufferGetWidthOfPlane(pixelBuffer, 1)
let chromaHeight = CVPixelBufferGetHeightOfPlane(pixelBuffer, 1)
let chromaRowBytes = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 1)

var sourceChromaBuffer = vImage_Buffer(data: chromaBaseAddress,
                                       height: vImagePixelCount(chromaHeight),
                                       width: vImagePixelCount(chromaWidth),
                                       rowBytes: chromaRowBytes)

查看完整参考资料在这里

我在CVPixelBuffer的格式中提到了亮度和色度作为其中一种可能性。根据OP问题中记录的数据(显示2个平面),看起来你可能是正确的。这是你用来确定OP像素缓冲区数据格式的方法吗? - Duncan C

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接