视频 YUV 理解记录

452 阅读3分钟

1、什么是YUV

YUV是指亮度参量和色度参量分开表示的像素格式,其中Y表示亮度(Luminance和Luma),也就是灰度值,可以简单理解为旧年代的黑白电视显示的样子;U和V表示色度,作用就是描述视频帧的色彩和饱和度,用于置顶像素的颜色,也是因为加入这个描述参数,才有了彩色电视。

平时开发中使用的色彩值,iOS中较多用的是RGB,和RGB类似,YUV也是一种颜色的编码方式,它将亮度信息Y和色彩信息UV分离,即,单独的Y只是黑白图像,有了UV就能显示出色彩。那么为什么要单独创造这个编码格式?RGB不香吗?是由于YUV可以通过一些压缩方式,使得视频在传输过程中的数据小了很多。

这里简单的说下RGB和YUV的关系和区别: RGB是从颜色发光的原理来设计的,也就是我们常说的红绿蓝三原色,是根据外在事物颜色样子的具体表现而设计的,如果不考虑传输和存储,那么RGB也可以直接用来展示视频。

那么为什么要有YUV?我的理解是YUV是为了优化采集到的数据内容过大,提出的一种根据人类所能见的色彩范围而设计的一种不敏感数据过滤的编码方式,一般显示器中,YUV最后也是会通过固定公式转换为RGB去渲染出一帧帧图片(因为RGB显示器更加普遍,未来或许会发生变革)。可以理解为YUV是一种RGB的升级版,且色域和数据大小可控性都比RGB好。

下面举例对比: 存储1280720像素图片大小的计算公式: 一张RGB 格式的图片:1280720*3/1024/1024 = 2.63MB

一张YUV4:4:4格式的图片: (1280 * 720 * 8 + 1280 * 720 * 1 * 8 * 2)/ 8 / 1024 / 1024 = 1.76 MB

一张YUV4:2:2格式的图片:

(1280 * 720 * 8 + 1280 * 720 * 0.5 * 8 * 2)/ 8 / 1024 / 1024 = 1.76 MB

一张YUV4:2:0格式的图片:

(1280 * 720 * 8 + 1280 * 720 * 0.25 * 8 *2)/ 8 / 1024 / 1024 = 1.32 MB

2、YUV的存储格式

YUV有两大存储类:planar和packed

planar:先连续存储所有像素点的Y,紧接着存储所有像素点的U,然后是所有像素点的V

YUV422 planar格式存储数据分量图: 10186620-d666d12cb3c12541.png

YUV420 planar格式存储数据分量图:

420p.png

packed:每个像素点的Y、U、V都是连续交叉存储的 YUV422 packed格式存储数据分量图: packed422.png YUV420 packed格式存储数据分量图: 10186620-6b1819d405ee91ca.png 如上图,存储方式已经很明确了,只是初了422分量存储方式外,还有更加减少空间的420和同RGB差不多大小的444方式。

这些是常用的几种数据编码,还有有些比如YUV420sp

420spp.png 这些格式其本质都是将YUV进行拆解,按照不同的协议去排放位置,在解码的时候按照对应的数据位置和约定的格式去解就行。

3、YU12(又称I420)、YV12、NV12、NV21

这些都是属于YUV420 planar格式,是四个Y通用一组UV数据。

YUV444是 Y:U:V = 1:1:1

YUV422是 Y:U:V = 2:1:1

YUV420是 Y:U:V = 4:1:1

其中区别是U和V的存储方式,比如NV12(通常是iOS上使用) 是

NV12.png

NV21(Android上使用)

NV21.png

总结,不管是怎样的存储方式,都是将YUV按照约定的格式,将Y、U、V数据进行分量排布。如果出现视图显示不对是,查看是不是协议对不上或是有数据丢失和重叠。