音视频图像篇 YUV-RGB
1.基础概念
位深
:是指在记录数字图像的颜色时,计算机实际上是用每个像素需要的位深表示,比如红色分量用8bit。
我们看到的彩色图片,都有3哥通道,分别为red,green,blue,透明度alpha。通常每个通道用8bit表示,8bit能表示256种颜色,所以可以组成256x256x256=16777216种颜色。这里的8bit就是位深。
每个通道的位深越大,能够表示的颜色值就越大,
帧率
:在1秒钟时间里传输的图片的帧数,也可以理解为图片处理器每秒钟刷新几次。比如25fps表示一秒钟内有25张图片。
码率
:视频文件在单位时间内使用的数据流量。比如1Mbps。
stride
:指内存中每行像素所占的空间。为了时间内存对齐每行像素中所占的空间并不一定是图像的宽带。
2.RGB、YUV深入讲解
2.0 RGB:红、绿、蓝三基色
2.1 YUV:Y表示明亮度(luminance或luma),也就是灰阶值,U和V表示的则是色度(chrominance或chroma)
YUV是一种笼统的说法,针对其他的具体排列方式,可以氛围很多种具体的格式:
打包格式(packed):将每个像素的Y、U、V分量交叉并以像素点为单位连续的存放在同一数组中,通常几个相邻的像素组成一个宏像素(macro-pixel);
平面(planar):使用三个数组分开连续的存放Y、U、V三个分量,即Y、U、V存放在各自的数组中。
2.1.1 YUV采样表示法
YUV采用A:B:C表示法来描述Y,U,V采样频率比例,下图中黑点表示采样像素点分量,空心圆表示采样像素点的UV分量。主要分为YUV 4:4:4,YUV 4:4:2,YUV 4:2:0,这几种常用的类型。
(实心代表Y分量,空心代表UV分量)
2.1.2 YUV数据存储
下面以每个分量数据存储在一个char或byte中为例描述YUV的数据的存储方式。
-
4:4:4格式
-
4:2:2格式
-
4:2:0格式
4:2:0格式 NV12
4:2:0格式 其他参考
2.3 RGB和YUV的转换
通常情况下RGB和YUV直接的相互转换都是通过接口调用实现,比如ffmpeg的swscale或者libyuv等库。
2.4 RGB和YUV转换(为什么解码出错显示绿屏?)
2.5 YUV Stride对齐问题
比如分辨率638×480的YUV420P图像,我们在内存处理的时候如果以16字节对齐,则638不能被16整除,我们需要在每行尾部补充2个字节。就是640。此时该图片的Y stride为640字节