7

CVPixelBuffer对象中,有一个或多个平面。(参考)我们有方法来获取数字,高度,平面的基地址。

那么飞机究竟是什么?它是如何在 a 内部构造的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>
4

2 回答 2

14

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

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

(在 RGBA 格式中,内存中一个像素的红色、绿色、蓝色和 alpha 值一个接一个,然后是另一组 4 字节的下一个像素的颜色值,等等。)这个是交错的颜色信息。

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

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

我不CVPixelBuffer经常与 s 混在一起,无法知道您所要求的血腥细节,并且必须投入大量时间和大量咖啡,然后才能“转动”我的大脑以掌握这些血腥细节。

编辑:

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

于 2016-11-01T02:23:18.100 回答
2

尽管在处理CVPixelBuffers 时现有的和已接受的答案包含丰富的重要信息,但在这种特殊情况下,答案是错误的。问题所指的两个平面是亮度色度平面

亮度是指亮度,色度是指颜色 - 来自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)

在此处查看完整参考。

于 2020-05-05T08:17:02.667 回答