YUV和RGB颜色编码方式

问题1:为什么要用YUV?

答:减小视频文件大小,节省宽带。

问题2:视频采用YVU方式,丢失像素,视频会模糊吗?

答:理论上视频是会变模糊,因为像素丢失了。
实际肉眼不会感觉到模糊。因为视频正常是1秒60FPS,就是60张图片,视频是一个动态的过程。

问题3:视频减小存储空间方式?

1、视频采集格式,采用YUV 4:2:0 采样方式。
2、采用视频压缩编码格式进行压缩。
H264:压缩比 102:1
H265:压缩比是H264的一倍

问题4:视频文件显示流程?

所有播放器都是以下流程:
1、从服务器获取mp4/mov/avi等类型视频容器。
2、从容器中获取H264视频压缩文件。
3、解码获取YUV信号。
4、用OpenGL ES 或 Metal渲染。

问题5:视频文件显示为什么要转RGBA,什么时候进行YUV -> RGBA?

1、设备只支持RGBA方式。
2、确认视频要渲染时,将YUV -> RGBA。
3、是由GPU来完成。
4、顶点着色器(确定位置)。
5、片元着色器(计算每个像素点的颜色值)。片元函数进行渲染时,进行YUV -> RGBA计算。

1、RGB 颜⾊编码方式

RGB 称为三原色,以不同比例混合得到多种颜色。
图片是由像素矩阵构成,每个像素包含RGBA。
在图像显示中,375 * 667大小的图片,代表着有375 * 667个像素点。每个像素点的颜色显示都采用RGB编码方式。每个像素点都有RGB(忽略A)三原色,其中每个原色都占用 8 bit,则一个像素点占用 24 bit,也就是三个字节。
则一张375 * 667的图片,就占用 375 * 667 * 3 / 1024 / 1024 = 0.72 MB 存储空间。

2、YUV 颜色编码方式

YUV 颜色编码采用 明亮度 和 ⾊度 来指定像素的颜色。其中,Y 表示明亮度,⽽ U 和 V 表示⾊度。
每个像素点都包含 Y、U、V 分量。但是 Y 和 UV 分量是可以分离的,如果没有 UV 分量一样可以显示完整的⿊白图像。

YUV 主流采样方式:
1、YUV 4:4:4
2、YUV 4:2:2
3、YUV 4:2:0
1、YUV 4:4:4 采样: Y、U、V 三个分量的采样⽐例相同。因此每个像素的三个分量信息完整,共 24 bit,也就是三个字节。
假如图像像素为:
[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那采样的码流为:
Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
最后映射出的像素点依旧为:
[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
则一张375 * 667的图片,就占用 375 * 667 * 3 / 1024 / 1024 = 0.72 MB 存储空间。
这种采样⽅式与RGB 颜⾊模型的图像⼤小是一样。
注:在实际项目中不使用这种采样方式,压缩比不够,达不到节省宽带目的。
2、YUV 4:2:2 采样:Y 分量采样是 UV 分量的一倍。
假如图像像素为:
[Y0 U0 V0]、[Y1 U1 V1]、[Y2 U2 V2]、[Y3 U3 V3]
那采样的码流为:
Y0 U0 Y1 V1 Y2 U2 Y3 V3
最后映射出的像素点为:
[Y0 U0 V1]、[Y1 U0 V1]、[Y2 U2 V3]、[Y3 U2 V3]
分析:采用左右相邻2个像素借用。第一和第二像素点公用了 U0、V1 分量,第三和第四像素点公⽤了 U2、V3 分量,这样就节省了图像空间。
则一张375 * 667的图片,就占用(375 * 667 * 8 + 375 * 667 * 0.5 * 8 * 2)/ 8 / 1024 / 1024 = 0.47 MB 存储空间。
3、YUV 4:2:0 采样:Y 分量全部要,Y 与(U或V)分量按照 2:1 方式采样。在每一⾏只扫描一种色度分量(U 或者 V)。
假设图像像素为:
[Y0 U0 V0]、[Y1 U1 V1]、 [Y2 U2 V2]、 [Y3 U3 V3]
[Y5 U5 V5]、[Y6 U6 V6]、 [Y7 U7 V7] 、[Y8 U8 V8]
那采样的码流为:
Y0 U0 Y1 Y2 U2 Y3 Y5 V5 Y6 Y7 V7 Y8
最后映射出的像素点为:
[Y0 U0 V5]、[Y1 U0 V5]、[Y2 U2 V7]、[Y3 U2 V7]
[Y5 U0 V5]、[Y6 U0 V5]、[Y7 U2 V7]、[Y8 U2 V7]
分析:采用左右相邻2个像素借用,上下2个相邻像素借用。
则一张375 * 667的图片,就占用(375 * 667 * 8 + 375 * 667 * 0.25 * 8 * 2)/ 8 / 1024 / 1024 = 0.36 MB存储空间。
注:在实际项目中采用这种采样方式。

3、RGB与YUV关系

RGB占用存储空间大。
YUV占用存储空间小。
图像显示器只能通过 RGB 模型来显示。因为设备只支持RGBA。
传输图像数据时使用 YUV 模型。因为 YUV 模型可以节省带宽。
因此采集图像时直接设置采集 YUV 模型视频数据,显示时将 YUV 模型转换为 RGB 模型。

4、RGB到YUV转换

1、BT601(标清国际定义)
//*********************BT601***********************************//
Y = 0.299 * R + 0.587 * G + 0.114 * B    
Pb =-0.169 * R - 0.331 * G + 0.500 * B
Pr = 0.500 * R - 0.439 * G - 0.081 * B
R = Y + 1.402 * Pr           
G = Y - 0.344 * Pb - 0.792 * Pr  
B = Y + 1.772 * Pb           
//*********************BT601***********************************//

2、BT709(高清)
//*********************BT709***********************************//
Y = 0.213 * R + 0.715 * G + 0.072 * B     
Pb =-0.115 * R - 0.385 * G + 0.500 * B
Pr = 0.500 * R - 0.454 * G - 0.046 * B
R = Y + 1.402 * Cr             
G = Y - 0.344 * Cb - 0.792 * Cr  
B = Y + 1.772 * Cb           
//*********************BT709***********************************//

推荐阅读更多精彩内容