音视频入门之YUV颜色编码

2021/5/4 18:26:59

本文主要是介绍音视频入门之YUV颜色编码,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度、浓度(Chrominance、Chroma)相对我们都比较熟悉的编码格式RGB,RGB诉求于人眼对色彩的感应,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。

关于yuv转RGB这里有个公式可以知己使用:
在这里插入图片描述
或者直接用yuv的矩阵乘以以下矩阵得到对应的RGB矩阵:
在这里插入图片描述

yuv就先介绍到这里,熟悉yuv对于后面yuv视频播放至关重要。

参考:

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



这篇关于音视频入门之YUV颜色编码的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程