音视频开发基础知识之YUV颜色编码

2,588 阅读7分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

更多博文,请看音视频系统学习的浪漫马车之总目录

实践项目: 介绍一个自己刚出炉的安卓音视频播放录制开源项目

视频理论基础:
视频基础知识扫盲
音视频开发基础知识之YUV颜色编码
解析视频编码原理——从孙艺珍的电影说起(一)
解析视频编码原理——从孙艺珍的电影说起(二)
H264码流结构一探究竟

上一篇视频基础知识扫盲介绍了视频最基础的知识,里面在位深一章节有提到RGB颜色编码,也是最常用的一种颜色编码,不过在视频传输过程中,为了节省体积,往往会使用另一种颜色编码来实现,那就是YUV。

一般来说,我们平时接触到的颜色编码大都是RGB,比如大部分显示器用的是RGB,平时做开发在程序中设置颜色的时候用的一般是RGB,那么YUV又是什么,和RGB有什么联系呢?

YUV,是一种颜色编码方法。常使用在各个影像处理组件中。YUV在对照片或视频编码时,考虑到人类的感知能力,允许降低色度的带宽。比如移动端Camera拍照捕获的图像数据、直播推流的流数据都是用这种编码格式

与颜色编码YUV息息相关的是颜色空间YCrCb,其中Y”表示明亮度(Luminance、Luma),是RGB各个分量的加权之和:

在这里插入图片描述 其中k为系数。

“Cr”和“Cb”则是色度、浓度(Chrominance、Chroma),“Cb”表示蓝色值跟亮度的差距,“Cr”表示红色值跟亮度的差距:

在这里插入图片描述

但是现在颜色编码YUV和颜色空间YCrCb经常混为一谈了,所以后面提到的‘U’可以看做和‘Cr’等同,‘V’可以看做和‘Cb’等同。

RGB诉求于人眼对色彩的感应,相比于与RGB三个分量都是色彩相关的特性,YUV最大的特性就是将亮度和色度分离开来

YUV则着重于视觉对于亮度的敏感程度YUV在对照片或影片编码时,考虑到人类的感知能力,允许降低色度的带宽。换句话说,也就是编码的时候允许Y的量比UV要多,允许对图片的UV分量进行下采样,这样数据占用的空间就比RGB更小(关于下采样,简单来说就是以比原来更低的采样率进行采样。详细可以看下维基百科:Downsampling (signal processing)也可以看下知乎这篇文章:oversampling,undersampling,downsampling,upsampling 四个概念的区别和联系是什么?)。

图像中的Y, U,和V组成: 图像中的Y', U,和V组成

这样说有点抽象,可以看看微软这篇有名的文章进行理解:Video Rendering with 8-Bit YUV Formats

这里主要讲yuv的两个方面,分别是采样格式和存储格式。采样格式简单可以理解一张原图,每个像素怎么采样yuv各个分量,比如每隔几个像素采一个y分量(或者u、v)。存储格式简单来说就是采样之后,按照什么方式存储,比如哪个字节存储y,第几个字节存储u。

yuv采样格式:

文章里面“YUV Sampling”一节详细说明了各种不同格式的yuv是如何采样的。 以下是对该章节的节选翻译:

YUV的优点之一是,感知质量不会显著下降的前提下,色度通道的采样率与Y通道的采样率相比更低。一般用一个叫做A:B:C(即y:u:v)的符号用来描述U和V相对于Y的采样频率,为了方便理解,使用图来描述,图中y分量使用x表示,uv使用o表示:

4:4:4:

意味着色度通道没有向下采样,也就是说yuv三个通道都是全采样:

4:4:4

4:2:2:

表示2:1水平下采样,没有垂直下采样。每条扫描线包含四个Y样本对应两个U或V样本。也就是水平方向按照y:uv使用2:1进行采样,垂直方向全采样的方式:

4:2:2

4:2:0:

表示2:1水平下采样,2:1垂直下采样。也就是水平方向按照y:uv使用2:1进行采样,垂直方向按照y:uv使用2:1的方式:

4:2:0

注意这里4:2:0并不代表y:u:v = 4:2:0,这里指的是在每一行扫描时,只扫描一种色度分量(U 或者 V),和 Y 分量按照 2 : 1 的方式采样。比如,第一行扫描时,YU 按照 2 : 1 的方式采样,那么第二行扫描时,YV 分量按照 2:1 的方式采样。所以y和u或者v的比都是2:1。

4:1:1:

表示4:1水平下采样,没有垂直下采样。每条扫描线包含四个Y样本对应于每一个U或V样本。

4:1:1抽样比其他格式更少见,本文不详细讨论。

yuv存储格式:

YUV存储格式有两大类:planar 和 packed: packed:Y、U和V组件存储在一个数组中。每个像素点的Y,U,V是连续交错存储的。和RGB的存储格式类似。 planar :Y、U和V组件存储为三个独立的数组中。

y、u、v每个采样点使用8bit存储。

接下来详细讲下集中常见的yuv格式存储方式:

4:2:2格式:

主要有两种具体格式:

YUY2:

属于packed类型,YUY2格式,数据可视为unsigned char数组。第一个字节包含第一个Y样本,第二个字节包含第一U (Cb)样本,第三字节包含第二Y样本,第四个字节包含第V (Cr)样本,以此类推,如图: YUY2 可以看到,Y0 和 Y1 公用 U0 V0 分量,Y2 和 Y3 公用 U1 V1 分量,以此类推。

UYVY:

也是属于属于packed类型的,和YUY2和类似,只是存储方向是相反的: UYVY

4:2:0格式

该格式又包含多种存储方式,这里重点将以下几种:

YUV 420P 和 YUV 420SP 都是基于 Planar 平面模式 进行存储的,先存储所有的 Y 分量后, YUV420P 类型就会先存储所有的 U 分量或者 V 分量,而 YUV420SP 则是按照 UV 或者 VU 的交替顺序进行存储了,具体查看看下图(图来源于:音视频基础知识---像素格式YUV):

YUV420P:

(这里需要敲黑板,因为本文播放的yuv就是YUV420P格式,熟悉它的存储格式才可以理解代码中读取视频帧数据的逻辑)
YUV420P
正是因为 YUV420P是2:1水平下采样,2:1垂直下采样,所以y分量数量等于视频宽高,u和v分量都是视频宽乘以高/4

YUV420SP

YUV420SP 4:2:0格式还有YV12、YU12、NV12 、NV21等存储格式,这里因为篇幅关系就不做细谈。

yuv转RGB:

目前一般解码后的视频格式为yuv,但是一般显卡渲染的格式是RGB,所以需要把yuv转化为RGB。

这里涉及到 Color Range 这个概念。Color Range 分为两种,一种是 Full Range,一种是 Limited RangeFull Range 的 R、G、B 取值范围都是 0~255。而 Limited Range 的 R、G、B 取值范围是 16~235。

对于每种Color Range来说,还有不同的转换标准,常见的标准主要是 BT601 和 BT709(BT601 是标清的标准,而 BT709 是高清的标准)。

所以对于不同Color Range和不同标准,组合起来就有4种转换公式(图来源于:YUV & RGB:原来图像是这么丰富多彩的):

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结

本文主要介绍了YUV基本概念以及YUV的采样格式和存储格式以及YUV和RGB之间的转换,这对于以后理解视频编码以及渲染极为关键。

下一篇开始进入鸡冻人心的视频编码部分:解析视频编码原理——从孙艺珍的电影说起(一)

参考:

Downsampling (signal processing)
oversampling,undersampling,downsampling,upsampling 四个概念的区别和联系是什么?
音视频基础知识---像素格式YUV
Video Rendering with 8-Bit YUV Formats
YUV百度百科
音视频基础知识---像素格式YUV

原创不易,如果觉得本文对自己有帮助,别忘了随手点赞和关注,也是对笔者的肯定~