在CVPixelBuffer对象中,有一个或多个平面。 (reference) 我们有方法来获得飞机的数量,高度,基地址。
那么飞机究竟是什么?它是如何在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>
答案 0 :(得分:6)
视频格式是一个非常复杂的主题。
某些视频流的像素存储为RGBA,ARGB,ABGR或其他几种变体(带或不带alpha通道)
(在RGBA格式中,你在内存中有一个像素的红色,绿色,蓝色和alpha值,然后是另一组4个字节,下一个像素的颜色值等等。)这是隔行扫描的颜色信息。
某些视频流将颜色通道分开,因此所有红色通道,蓝色,绿色和alpha都作为单独的“平面”发送。您将获得一个包含所有红色信息的缓冲区,然后是所有蓝色数据,然后是绿色,然后是alpha,如果包含alpha。 (想想彩色底片,其中有单独的乳液层来捕捉不同的颜色。乳液层是颜色信息的平面。这与数字相同。)
有些颜色数据在一个或两个平面中的格式,然后亮度在一个单独的平面上。这就是模拟彩电的工作原理。它以黑白(亮度)开始,然后广播公司添加了边带信号以传达颜色信息。
我不会经常使用CVPixelBuffers来了解你所要求的血腥细节,并且必须投入大量的时间和大量的咖啡才能“旋转”我的大脑足以掌握那些血淋淋的细节。
答案 1 :(得分:0)
尽管在处理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)
查看完整的参考文献here。