在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>发布于 2016-11-01 02:23:18
视频格式是一个非常复杂的主题。
有些视频流以字节为单位存储像素RGBA、ARGB、ABGR或其他几个变体(有或没有alpha通道)
(在RGBA格式中,一个像素的红色、绿色、蓝色和alpha值在内存中一个接一个,然后是另一组4个字节,其中包含下一个像素的颜色值,等等)。这是交错的颜色信息。
一些视频流将颜色通道分开,所以所有的红色通道,蓝色,绿色和阿尔法都被作为单独的“平面”发送。如果包含alpha,您将得到一个包含所有红色信息的缓冲区,然后是所有蓝色数据,然后是所有绿色数据,然后是alpha数据。(想想彩色底片,那里有不同的乳胶层来捕捉不同的颜色。乳胶层是颜色信息的平面。这与数字技术是一样的。)
有一些格式,其中颜色数据在一个或两个平面,然后亮度是在一个单独的平面。这就是旧的模拟彩电的工作原理。它从黑白(亮度)开始,然后广播公司添加了边带信号来传递颜色信息。(色度)
我不会经常和CVPixelBuffer混在一起,不知道你想要的是什么血淋淋的细节,我必须投入大量的时间和大量的咖啡,然后我才能“振作”我的大脑,以掌握那些血淋淋的细节。
编辑:
因为您的调试信息显示了两个平面,所以这个像素缓冲区似乎有一个亮度通道和一个色度通道,就像@zeh的答案中提到的那样。
发布于 2020-05-05 08:17:02
尽管现有和被接受的答案在处理CVPixelBuffer时包含了丰富的重要信息,但在这种特殊情况下,答案是错误的。问题所指的两个平面是亮度和色度平面。
亮度是指亮度,色度是指颜色-来自奎拉。
以下来自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)请参阅完整参考这里。
https://stackoverflow.com/questions/40353149
复制相似问题