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
时,现有的和被接受的答案包含丰富的重要信息,但在这种特殊情况下,答案是错误的。问题涉及的两个平面是 luminance 和 chrominance 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。
在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
时,现有的和被接受的答案包含丰富的重要信息,但在这种特殊情况下,答案是错误的。问题涉及的两个平面是 luminance 和 chrominance 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。