QVideoFrame :: planeCount()和QVideoFrame :: bytesPerLine的含义

时间:2018-11-04 14:19:57

标签: qt qvideoframe

QVideoFrame::planeCount

  

返回视频帧中的平面数。该值仅   在映射帧数据时有效

QVideoFrame::bytesPerLine

  

返回扫描行中的字节数。

我对这些陈述不太理解,有人可以详细解释吗?

使用QVideoFrame :: map后,从网络摄像头获得以下数据

width=640
height=480
pixelFormat=Format_RGB32
bytesPerLine=2560
mappedBytes=122880
planeCount=1

1 个答案:

答案 0 :(得分:1)

扫描线是视频图像的一行。 (术语“扫描线”是在阴极射线逐行扫描屏幕管表面的常用技术– Scan line时创造的。)

如果bytesPerLine除以widthbytesPerLine / width = 2560/640 = 4),则得出每个像素的字节数。

如果每个像素的计算字节数不是整数值,则该行将对齐至某个倍数(通常为4)。一个复杂的例子来说明这一点:

width=458
pixelFormat=Format_RGB24
bytesPerLine=1376 (a multiple of 4)

1376/458 = 3.0043668122270742358078602620087(根据我的Windows计算器)

458 * 3 = 1374→有2个字节将行填充为4的下一个倍数(未使用的字节,应忽略)。

在OP的示例中,这不是问题-像素格式本身具有与行对齐方式匹配的大小。

因此,这4个字节与pixelFormat的{​​{1}}含义匹配:

  

使用32位RGB格式(0xffRRGGBB)存储的帧。这等效于QImage::Format_RGB32

32位= 4字节。

飞机的数量比较棘手。我在Google上搜索了自己,发现了Single- and multi-planar APIs

  

某些设备要求将每个输入或输出视频帧的数据放置在不连续的内存缓冲区中。在这种情况下,必须使用一个以上的存储器地址来寻址一个视频帧,即每个“平面”一个指针。平面是当前帧的子缓冲区。

对于OP,有1个平面–像素的颜色分量被连续存储(打包)。

另一个示例,其中飞机数量大于1:Format_RGB32

  

使用8位每分量平面YUV格式存储帧,同时水平和垂直地对U和V平面进行子采样,即U和V平面的高度和宽度是Y平面的高度和宽度的一半。 / p>

这意味着像素的颜色分量没有打包在一起(例如在QVideoFrame::Format_YUV420P中),但是每个平面仅存储一个像素的一个颜色分量。要重建像素,必须从每个平面读取并分别组合相应的颜色分量。

在有多个平面的情况下,应使用Format_RGB32的2 nd 风格:

  

int QVideoFrame::bytesPerLine(int plane) const

     

返回平面的扫描线中的字节数。

在上述引用的bytesPerLine()中:水平和垂直方向对U和V分量进行了采样。即要获得(x,y)=(123,72)的像素,必须读取以下分量:

  • Y分量偏移QVideoFrame::Format_YUV420P
  • 偏移量为72 * getBytesPerLine(0) + 123的U分量
  • 偏移量72 / 2 * getBytesPerLine(1) + 123 / 2处的V分量。