首先确认YUYV与NV12 的采样格式, YUYV 属于YUV4:2:2采样, 而NV12属于YUV4:2:0采样。 采样方式如下图所示:
实心圆表示Y分量, 空心圆表示一对U和V的分量。并且YUV图像中每一个Y分量,即表示一个像素点。
可以很明显地看出YUV422采样中两个像素点共用一对U和V的分量, 而YUV420采样中四个像素点共用一对U和V 的分量。有了这个概念,接下来的理解将十分轻松。
两者在存储方式上的表现如下图所示:
在文件大小上,
YUYV: filesize = width * height + width * height / 2 + width * height / 2
NV12 : filesize = width * height + width * height / 4 + width * height / 4
即同条件的 NV12 文件大小是 YUYV 的 3/4。
那么你或许会烦躁了,怎么还不讲转化啊。别急,转换原理就是一两句话的事,上述都是铺垫。
转换原理: YUV4:2:2 —> YUV4:2:0 Y不变,将U和V信号值在行(垂直方向)在进行一次隔行抽样。具体到YUYV 和NV12 上,则是仅需要注意存储方式的差别。