【问题标题】:What is plane in a CVPixelbuffer?CVPixelbuffer 中的平面是什么?
【发布时间】:2017-03-14 04:24:28
【问题描述】:

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>

【问题讨论】:

    标签: ios cvpixelbuffer


    【解决方案1】:

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

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

    (在 RGBA 格式中,您会在内存中一个像素的红色、绿色、蓝色和 alpha 值一个接一个地出现,然后是另一组 4 字节的下一个像素的颜色值,依此类推.) 这是交错的颜色信息。

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

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

    我不经常与CVPixelBuffers 混在一起,无法知道您所问问题的血腥细节,并且必须投入大量时间和大量咖啡,然后才能足够“转动”我的大脑掌握那些血淋淋的细节。

    编辑:

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

    【讨论】:

      【解决方案2】:

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

      亮度是指亮度,色度是指颜色 - 来自Quora

      Apple 的以下代码 sn-p 更清楚:

      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 格式的一种可能性。根据 OP 问题中记录的数据(它显示 2 个平面),看起来您可能是对的。这是您用来确定 OP 像素缓冲区数据的格式吗?
      猜你喜欢
      • 2017-06-08
      • 1970-01-01
      • 2019-02-03
      • 1970-01-01
      • 2023-01-14
      • 2013-11-04
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多