NV12格式和UV平面

9
我对NV12格式有点困惑。我正在查看此页面以了解该格式。 目前我的理解是,如果您有一个640 x 480尺寸的图像或视频,则Y平面将具有640 x 480字节,而U和V两个平面均为640/2 x 480/2。这并不意味着U平面有640/2 x 480/2,而V平面有640/2 x 480/2,它们都只有640/2 x 480/2字节。因此,输出缓冲区中的总字节数为2 * (640/2) * (480/2)
byte [] myArray new byte[(640 * 480) + (2 * (640/2) * (480/2)) ];

所以问题是,我是否正确理解了它?我是否按照指定的NV12格式制作了字节数组。


1
所以“数组将是2乘以(640/2)*(480/2),因为UV平面将占用两个字节。”我不明白。 - ashishdhiman2007
3个回答

31

NV12格式采用4:2:0的子取样率。

420

一帧的总大小为W x H x 3 / 2,其中W是宽度,H是高度。

VGA分辨率下的1帧大小为460800字节,其中

  • Y部分占据640x480字节
  • Cb部分占据640*480/4=76800字节
  • Cr部分占据640*480/4=76800字节

希望这回答了你的问题...


2

除了第一个答案之外,NV12格式交错存储了U和V色度数据。

对于一个640x480的图像帧,其NV12表示由720行640字节组成:

  • 前480行每行包含640个亮度(Y)值。

  • 最后240行每行包含320个(U,V)元组。


0

是的,你的理解是正确的。

YUV NV12 格式有一个大小为图像高度*宽度的 Y 平面和另一个由子采样交错的 U V 值组成的半平面 (高度/2 * 宽度/2)。总大小就像你正确计算的那样是 高度*宽度 + 2 * (高度/2 * 宽度/2) = 3/2 * 高度 * 宽度

NV12 每个像素有 12 位。

==============

Microsoft网站上所提到的,跳转到NV12部分:

YUV采样

色度通道可以具有比亮度通道更低的采样率,而不会出现明显的感知质量损失。一种称为“A:B:C”表示法用于描述U和V相对于Y的采样频率:

  • 4:4:4表示未对色度通道进行下采样。
  • 4:2:2表示水平下采样2:1,无垂直下采样。每个扫描线包含四个Y样本和两个U或V样本。
  • 4:2:0表示水平下采样2:1,垂直下采样2:1。
  • 4:1:1表示水平下采样4:1,无垂直下采样。每个扫描线包含四个Y样本和一个U或V样本。 4:1:1采样比其他格式更少见,并且本文不详细讨论。

以下图示展示了每种降采样率下色度如何进行取样。亮度样本用十字表示,色度样本用圆圈表示。

图1:像素数据的子采样

NV12

所有Y样本作为无符号字符值的一维数组首先出现在内存中,该数组有偶数行。 Y平面紧随其后,是一个包含打包U(Cb)和V(Cr)样本的无符号字符值的一维数组。当将合成的U-V数组视为小端WORD值的数组时,LSB包含U值,而MSB包含V值。 NV12是DirectX VA的首选4:2:0像素格式。预计它将成为支持4:2:0视频的DirectX VA加速器的中期要求。以下插图显示了Y平面和包含打包的U和V样本的数组。

图2:输入图像描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接