RGB、YUV420、NV21、I420编码区别

一、RGB与YUV

首先了解视频编码为什么使用YUV420而不是rgb。那么需要了解两者的原理,看图说话

所以从内存的角度来说,yuv单位像素使用的内存更低,但是两者表示的效果是一致的,也可以认为rgb过度绘制了,把人眼无法分辨的区域也进行了绘制。

下面看一下两者之间内存暂用对比,这里采用·rgb24对比

RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。在一个2*2的像素区域,RRG暂用的字节数为2*2*3=12字节。那么用yuv表示,占用的字节数为4(Y)+1(u)+1(v)=6字节,其中Y占用4个字节,U和V各占用1字节,比例为4:1:1

所以在一个宽高为w*h的设备上,使用rgb表示编码占用的字节数为w*h*3,使用yuv表示暂用的内存为w*h*+w*h/4+w*h/4 = w*h*3/2.

二、YUV与NV21

首先需要了解的是yuv有很多编码格式,其中yuv420就是一种,而nv21又是yuv420的一种。并且nv21是针对android设备的视频编码。

nv21编码格式:比如一张1920*1280的图片,经过nv21编码后,会变成前面1920*1280字节全是Y,从1920*1280字节长度开始,U和V会交替排列,它们的字节长度分别为1920*1280/4。请看下图

如图颜色框,4个Y会对应一个UV。

三、NV21与I420

I420也是YUV420编码格式的一种,由于android手机厂商的原因,摄像头采集到的数据永远都是经过NV21编码的数据,但是对于这种数据不能够显示在苹果或windows平台,那么需要对这个编码格式的数据需要重新编码,其中I420这种编码格式,所有的厂商都是适配的。

I420编码格式:比如一张1920*1280的图片,经过I420编码后,会变成前面1920*1280字节全是Y,从1920*1280字节长度开始,会先排列U,总字节长度为1920*1280/4,从1920*1280+1920*1280/4开始排列V,字节长度为1920*1280/4,所以总的字节长度适合NV21一样的,只是UV的编码顺序不一样。请看下图:

猜你喜欢

转载自blog.csdn.net/qinbin2015/article/details/90692425