FFmpeg之YUV基础(二)

1,180 阅读3分钟

FFmpeg之YUV基础(二)

起源

生活中,RGB三原色以及由三原色衍生出来的颜色构成了我们五颜六色的世界。我们能够看到同一颜色,这归功于我们的眼睛构造。人类眼睛的色觉具有的特性:视网膜存在三种视锥细胞,分别含由RGB三种光线敏感的视色素,当一定波长的光线作用于视网膜时,以一定的比例使三种视锥细胞分别产生不同程度的兴奋传至大脑神经中枢产生视觉。RGB颜色空间中,三者重要性并列。

RGB 存储占用的空间很大,在音视频中,需要很大的储存介质,传输起来也不快捷。那么我们需要对其压缩。优秀的前辈们根据人眼对亮度的敏感程度比色度更加敏感。于是YUV就诞生了。

简介

维基百科定义:YUV是编译true-color颜色空间(color space)的种类,Y'UV, YUV, YCbCrYPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示**明亮度(Luminance、Luma),“U”和“V”则是色度浓度**(Chrominance、Chroma)。Y'代表明亮度(luma; brightness)而U与V存储色度(色讯; chrominance; color)部分; 亮度(luminance)记作Y。

我们简单说就是: Y表示亮度;UV表示色度。

格式

  • 紧缩格式(packed formats): Y、U、V值存储成Macro Pixels数组,混合在一起的。如: UYVY、YUYV等
  • 平面格式(planar formats): 每Y分量,U分量和V分量都是以独立的平面组织的,也就是说所有的U分量必须在Y分量后面,而V分量在所有的U分量后面,此一格式适用于采样(subsample)。如: I420, YV12等。记住一个特殊:Semi-Planar,表示Y分量正常排列,UV相间排列, 如常见的NV21。

常用类型

平面格式planar

I420

I420.png

YUV 分量分别存放; Y 为 宽*高,接着排列U,为 1/4 * 宽*高,最后排列V,也是1/4 * 宽*高

YV12

YV12.png

​ YUV 分量分别存放; Y 为 宽*高,接着排列V,为 1/4 * 宽*高,最后排列U,也是1/4 * 宽*高。恰好和I420的UV排列反过来。

NV12

NV12.png

​ NV12也是Planar,和之前不同,UV是相间排列,这种称为 Semi-Planar。

​ Y 为 宽*高,UV总长为 1/2 * 宽*高

NV21

NV21.png

​ NV12也是Planar,和之前不同,UV是相间排列,这种称为 Semi-Planar。

​ Y 为 宽*高,UV总长为 1/2 * 宽*高

I422

I422.png

​ Y 为 宽*高,U 为 1/2 * 宽*高,Y 为 1/2 * 宽*高

YV16

​ 将I422的UV排列互换。

NV16

​ 属于YUV422sp的一种, sp,根据前面说的,应该是UV相间排列,这种YUY422sp中U打头与V分量相间排列。讲到这里,相信大家都可以联想到NV61。

I444

​ YUV按照1:1:1的比例排列。并且Y、U、V分量分别存放。依次为Y\U\V,长度都是3 * 宽 * 高

紧缩格式packed

YUVY

YUVY.png

​ YUV间隔排布,可以发现,两个Y共用一组UV。属于YUV422。

VYUY

​ 和YUVY仅仅是YUV相间排列的顺序不一样。两个Y共用一组UV。属于YUV422。

规则

  • I 开头的表示为 planar, 并且按照Y、U、V分量分别存放。
  • sp 表示 Semi-planar, 表示UV是相间排列。
  • p表示planar,不是packed。

参考

zh.wikipedia.org/wiki/YUV

blog.csdn.net/xjhhjx/arti…

www.jianshu.com/p/538ee63f4…

libYUV

Libyuv是一个开源项目,包括 YUV 缩放和转换功能。

下载:github.com/lemenkov/li…

编译看官方文档,这里提供一个编译好的,链接:pan.baidu.com/s/1tcToG4kY… 提取码:dydy

API看文档。注意理解步长的概念即可。