音视频基础 - YUV和RGB

1. 音视频名词概念

1.1 像素

像素是一张图片的基础单位,pixel,简称px
无数个像素组合在一起,就形成了一张图片。

在这里插入图片描述

1.2 分辨率

分辨率 = 垂直像素*水平像素,(理论上) 图像的分辨率越高,图像就越清晰。
比如下面左边这张图,胶乳一个方块就代表一个像素点,那么分辨率就是15px*16px,最终我们看到的就是很小的一张图片。

在这里插入图片描述

实际上分辨率高不一定图像就越清晰,因为可能图片本身就是模糊的

1.3 位深

我们看到的彩色图片,都有三个通道,分别为红®、绿(G)、蓝(B)通道。
(如果需要透明度则还有alpha分量)

通常每个通道用8bit表示,8bit能表示256种颜色,所以可以组成256*256*256=16777216=1677万种颜色

这里的8bit就是我们讲的位深。

在这里插入图片描述

每个通道的位深越大,能够表示的颜色值就越大。比如现在高端电视说的10bit色彩,即是每个通道用10bit表示,每个通道有1024种颜色。1024*1024*1024约为107374万色,是8bit64倍。

常见的颜色还是8bit居多

扫描二维码关注公众号,回复: 15847887 查看本文章

1.4 帧率

帧率即FPS,每秒有多少帧画面。 帧率越高就代表画面越流程,越低则越卡顿。

由于视觉图像在视网膜的暂时停留,图像帧率能达到24帧,我们就认为图像是连续动态的。

  • 电视帧率一般是24FPS
  • 电视剧一般是25FPS
  • 监控行业常用25FPS
  • 音视频通话常用15FPS

帧率越高,画面越流程,需要的设备性能也越高 (涉及到编码解码)。

1.5 码率

  • 视频文件在单位时间使用的数据流量,比如1Mbps
  • 大多数情况下码率越高,也就越清晰。但模糊的视频文件大小(码率)也可以很大,分辨率小的视频文件可能也不分辨率打的视频文件清晰。
  • 对于同一个原始图像源的时候,同样的编码算法,则码率越高,图像的失真就会越小,视频画面就会越清晰。

2. RGB、YUV的区别

  • RGB : 红色R、绿色G、蓝色B三基色
  • YUV : Y表示明亮度(Luminance或Luma),也就是灰阶值,U和V表示的则是色度(Chrominance或Chroma)

2.1 RGB

通常的图像像素是按RGB顺序进行排列,但有些图像处理要转成其他顺序,比如OpenCV经常转成BGR的排列方式。

在这里插入图片描述

2.2 YUV

RGB类似,YUV也是一种颜色编码方法,它是指将亮度参数Y(Luma)和色度参数U和V (Chroma)分开进行表示的像素编码格式。

这样分开的好处就是不但可以避免互相干扰,没有UV信息一样可以显示完整的图像,因而解决了彩色电视和黑白电视的兼容问题,还可以降低色彩的采样率而不会对图像质量影响太大,降低了视频信号传输时对宽频(带宽)的要求

  • 降低色彩的采样率而不会对图像质量影响太大 : YY共用一组UV分量 (根据YUV类型决定)

在这里插入图片描述
YUV是一个比较笼统地说法,针对它的具体排列方式,可以分为很多种

  • 打包(packed)格式 : 将每个像素点的Y、U、V分量交叉排列并以像素点为单位连续的存放在同一数组里,通常几个相邻的像素组成一个宏像素 (macro-pixel)
  • 平面(planar)格式 : 使用三个数组分开连续的存放Y、U、V三个分量,即Y、U、V分别存放在各自的数组中

在这里插入图片描述

3. YUV采样表示法

YUV采用A:B:C表示来描述Y、U、V采样频率比例

下图中黑点表示采样像素点Y分量,空心圆表示采样像素点UV分量。

在这里插入图片描述

  • 4:4:4 表示色度频道没有下采样 : 即一个Y分量对应着一个U分量和一个V分量
  • 4:2:2 表示2:1的水平下采样,没有垂直下采样,即每两个Y分量共用一个U分量和一个V分量
  • 4:2:0 表示2:1的水平下采样,2:1的垂直下采样,即每四个Y分量共用一个U分量和一个V分量

4. YUV数据存储

4.1 YUV数据存储 4:4:4格式

比如YUV444格式,对应FFmpeg像素表示AV_PIX_FMT_YUV444P,占24bit

在这里插入图片描述

4.2 YUV数据存储 4:2:2格式

比如YUV422P格式,对应FFmpeg像素表示AV_PIX_FMT_YUV422P,占16bit
在这里插入图片描述

4.3 YUV数据存储 4:2:0格式

最常用的一种格式,比如YUV420P格式,对应FFmpeg像素表示AV_PIX_FMT_YUV420P,占12bit

在这里插入图片描述

比如NV12格式,对应FFmpeg像素表示AV_PIX_FMT_NV12

在这里插入图片描述

4:2:0格式参考
在这里插入图片描述

I420也叫做YU12,在android平台下叫作I420格式
android手机从摄像头采集的预览数据一般都是NV21

5. RGB和YUV的转换

  • 通常情况下RGBYUV直接的相互转换都是调用接口实现,比如FFmpegswscale或者libyuv等库
  • 主要转换标准是BT601BT709
    • 8bit位深情况下
      • TV range16-235(Y)16-240(UV),也叫Limited Range
      • PC range0-255,也叫Full Range
      • RGB没有range之分,全是2-255

BT601 TV Range转换公式

在这里插入图片描述

从YUV转到RGB如果值小于0要取0,如果大于255要取255

5.1 为什么解码出错显示绿屏

因为RGBYUV的转换的时候,解码失败时YUV分量都填为0值,然后根据公式 :

R = 1.402 * (-128) = -126.598
G = -0.34414 * (-128) - 0.71414*(-128) = 135.45984
B = 1772 * (-128) = -126.228

RGB值范围为[0,255],所以最终的值为 :

R = 0
G = 135.45984
B = 0

此时只有G分量有值所以为绿色

6. YUV Stride对齐问题

比如分辨率638*480YUV420P图像
我们已经知道YUV420P的存储格式是如下图所示的
在这里插入图片描述
我们在内存处理的时候如果要以16字节对齐,所以所有的Y的数量要能被16整除,
638不能被16整除,我们需要在每行尾部填充2个字节动画就是640,此时该图片的Y stride640字节。
在这里插入图片描述

7. 其他

本文为看以下视频的学习笔记
音视频开发零基础系列-图像篇YUV-RGB-上|YUV的格式YUV的采样方式YUV的存储方式RGB 到 YUV的转换
音视频开发零基础系列-图像篇YUV-RGB-下|YUV的格式YUV的采样方式YUV的存储方式RGB 到 YUV的转换

猜你喜欢

转载自blog.csdn.net/EthanCo/article/details/131529006