I420、YV12、NV12、NV21等常见的YUV420存储格式

今天要讲的,主流的采样格式YUV420,它的存储格式通常就有四种:I420、YV12、NV12、NV21。

1、为什么会有存储格式?

存储格式是个非常容易理解的事情,我们已经知道YUV420采样格式,每采样8个Y分量,就有2个U分量和2个V分量。那么当把这8、2、2的采样数据存放到YUV文件时,如何存放呢?要知道,YUV数据存放到YUV文件里,可不像h264文件还有NALU进行包装,YUV文件存放的是采样的原数据,是直接把这8、2、2的采样数据存到文件里。

因此如果没有几个固定的存储格式,大家很容易会各存各的,这样即使我们知道他使用的是YUV420采样格式,我们也不能正确的打开并播放它。

就像本人目前在Mac上使用的一款付费YUV播放软件(vooya)一样(windows有免费版,有时间再介绍),如果要打开一个YUV文件,必须指定视频的宽高、YUV采样格式、存储格式,这三者YUV文件里都没有做标记,因此需要我们额外提供。主流做法是以视频宽高对文件进行命名,比如xxx1920x1080.yuv,而YUV采样格式和存储格式进入软件后再选择。

比如vooya:

2、YUV420的存储格式

在开发中,我们使用最多的,就是YUV420采样格式,这也是安卓和iOS除RGB外默认支持的采样格式。因此我们本篇主要讨论YUV420下,主要的这几种存储格式。

2.1 平面和交错

Y、U、V三个分量在存储的时候,通常以它们形成的平面(plane)来区分。比如对于一帧图像,先把所有的Y分量按序存储,接着是所有的U,最后是所有的V,也即YYYYYYYYUUVV,这就顺序形成三个平面。我们通常称这种能形成三个平面的存储格式为YUV420P,其实一般也就两种:YYYYYYYYUUVV和YYYYYYYYVVUU。

另一种就是交错存储的,在采样格式为YUV420时,通常只会U和V交错,也即存储格式为YYYYYYYYUVUV或YYYYYYYYVUVU。先把所有的Y分量按序存储,然后UV交错。这样Y分量形成一个平面,UV形成一个平面,总共两个平面,通常称为YUV420SP,这也是在安卓和iOS上使用的YUV存储格式。

2.2 I420、YV12、NV12、NV21的存储格式

简单来讲,它们的存储格式分别为:
I420: YYYYYYYYUUVV
YV12:YYYYYYYYVVUU
NV12:YYYYYYYYUVUV
NV21:YYYYYYYYVUVU

可以看出,I420和YV12有三个平面,属于YUV420P的,而NV12和NV21有两个平面,属于YUV420SP。

通常我们在YUV资源网站上,下载得到的YUV文件一般是I420的,也即先存Y、后存U、最后V。在上面展示的vooya软件中,Planar 4:2:0就是I420。

而NV12和NV21则较多应用在安卓和iOS上,比如在iOS摄像机采集的时候,只支持NV12和RGB

2.3 I420存储示例

我们也不画图了,在维基百科上,有更直观的I420存储格式的示例:

I420存储格式示例

图中从上倒下为Y、U、V的存储顺序,箭头颜色表示了Y、U、V的共用关系。

至于其他采样格式下的存储格式,一般情况下我们也用不到,待用到的时候略带一下即可,它们存储的思路都是一致的。并且作为颜色空间,YUV与RGB之间是可以互换的。

猜你喜欢

转载自blog.csdn.net/m0_60259116/article/details/125726735
今日推荐