CVPixelbuffer 中的平面是什么?

What is plane in a CVPixelbuffer?

CVPixelBuffer对象中,有一个或多个平面。 (reference) 我们有方法获取number,heigh,plane的基地址。

那么这架飞机到底是什么?以及它是如何在 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>

视频格式是一个极其复杂的主题。

一些视频流将像素存储在字节 RGBA、ARGB、ABGR 或其他几种变体(有或没有 alpha 通道)中

(在 RGBA 格式中,一个像素的红色、绿色、蓝色和 alpha 值一个接一个地存储在内存中,后跟另一组 4 个字节,其中包含下一个像素的颜色值, 等等) 这是隔行扫描的颜色信息。

一些视频流将颜色通道分开,因此所有红色通道、蓝色、绿色和 alpha 都作为单独的“平面”发送。您将获得一个包含所有红色信息的缓冲区,然后是所有蓝色数据,然后是所有绿色数据,然后是 alpha(如果包含 alpha)。 (想想彩色负片,其中有单独的乳剂层来捕捉不同的颜色。乳剂层是颜色信息的平面。这与数字的想法相同。)

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

我不经常与 CVPixelBuffer 打交道,无法了解您所问内容的详细信息,并且必须投入大量时间和大量咖啡才能“启动” “我的大脑足以掌握那些血淋淋的细节。

编辑:

由于您的调试信息显示了 2 个平面,因此该像素缓冲区似乎有一个亮度通道和一个色度通道,如@zeh 的回答中所述。

尽管在处理 CVPixelBuffer 时,现有的和被接受的答案包含丰富的重要信息,但在这种特殊情况下,答案是错误的。问题涉及的两个平面是 luminancechrominance planes

Luminance refers to brightness and chrominance refers to color - From Quora

Apple 的以下代码片段更清楚:

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)

查看完整参考 here