YUV 数据格式完全解析

         #采样比

人类视觉系统对亮度(luma)的敏感度高于对色度(chroma)的敏感度,因此可以对色度数据进行下采样:

采样比通常表示为 J:a:b,以表示一个宽为 J 像素、高为 2 像素的采样区域内 Y Cb Cr(Y U V)的采样比:

J 表示采样区域的宽度,通常为 4;

  • a 表示第一行色度采样数;
  • b 表示第二行色度采样与第一行色度采样的不同样点数;

例如上图:

        4:1:1:宽度 J 为 4,第一行只有一个样点(一种颜色),所以 a 为 1,第二行和第一行不同的样点只有一个,所以 b 为 1,所以为 4:1:1

   4:2:0:宽度 J 为 4,第一行有两个样点,所以 a 为 2,第二行和第一行样点完全相同,所以 b 为 0,所以为 4:2:0

        这个比例值并非 Y Cb Cr 分量个数的直接比例。对亮度来说,一个样点由一个 Y 构成,而对色度来说,一个样点由两个值构成:Cb 和 Cr。以 4:2:0 为例,在 4x2 的采样区域内,有 8 个亮度样点,2 个色度样点(在上图中可以看成左右各一个),所以有 8 个 Y,2 个 Cb,2 个 Cr。

        a 和 b 的取值并非可以随意组合,比如 a 为 2 时,表示第一行有两个样点,如果 b 为 1,那就是说第二行样点有一个和第一行不同,但到底哪一个样点和第一行不同,无法确定,所以这种组合就被禁止了。实际上常见的可取组合也就是上图中列出的五种。

        #planar, packed 和 semi planar

        planar, packed 和 semi planar 是描述分量如何存储的:

        *planar: 有时也称 triplanar,有三个 plane,每种分量连续存储,先存储所有的 Y 分量,再存储所有的 Cb 分量,最后存储所有的 Cr 分量(也可以 Cr 在前,Cb 在后);

        *packed: 只有一个 plane,n 个样点的 Y Cb Cr 分量一起存储,接着存储下 n 个样点的分量;n 的取值、其中三种分量的存储方式,也有多种组合;

        *semi planar: 有两个 plane,先存储所有的 Y 分量,后面 Cb 和 Cr 分量一起存储;

        #stride 或 pitch

        YUV 数据在内存中存储时,每行像素的数据后面可能还有填充字节,这主要是因为有些系统/环境/操作对内存的字节对齐有要求,比如 64 字节对齐,那么宽度为 720 像素的图像,一行就不满足 64 对齐的要求,那就要填充到 768 像素。存储一行像素所需的字节数,就叫 stride,也叫 pitch。比如这里举的例子,宽为 720,stride 或 pitch 就是 64。

        图像的高度通常没有类似的情况,因为图像处理通常都是逐行的,所以才会对一行的宽度有要求,而对于多少行则没有要求。

        #I420

        I420 的采样比是 4:2:0,它是 planar 存储方式,分量存储顺序依次是 Y, Cb, Cr,例如下图表示了宽为 6 像素、高为 4 像素图像的三种分量存储方式:

        最好忽略那几个箭头,采样区域通常都是 4x2,而非 2x2

        #NV12 

        安卓的 MediaCodec 对于 YUV 的输入格式,COLOR_FormatYUV420SemiPlanar 支持得最好,而这种格式就是 NV12 格式。

        NV12 的采样比是 4:2:0,它是 semi planar 存储方式,先存储 Y 分量,后面 Cb 和 Cr 分量一起存储,Cb 在前,Cr 在后:

        

        #NV21

        安卓的 Camera API 回调的 YUV 数据,默认就是 NV21 格式。

        NV21 和 NV12 类似,采样比是 4:2:0,也是 semi planar 存储方式,先存储 Y 分量,后面 Cb 和 Cr 分量一起存储,只不过 Cr 在前,Cb 在后:

        

         #其他格式

                YUV 的格式太多,这里就不一一介绍了,把握上面介绍的两个要点即可:采样比,存储方式。

              可以参考下 fourcc 的这个网页

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值