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
万色,是8bit
的64
倍。
常见的颜色还是
8bit
居多
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的转换
- 通常情况下
RGB
和YUV
直接的相互转换都是调用接口实现,比如FFmpeg
的swscale
或者libyuv
等库 - 主要转换标准是
BT601
和BT709
8bit
位深情况下TV range
是16-235(Y)
、16-240(UV)
,也叫Limited Range
PC range
是0-255
,也叫Full Range
- 而
RGB
没有range
之分,全是2-255
BT601 TV Range
转换公式
从YUV转到RGB如果值小于0要取0,如果大于255要取255
5.1 为什么解码出错显示绿屏
因为RGB
和YUV
的转换的时候,解码失败时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*480
的YUV420P
图像
我们已经知道YUV420P
的存储格式是如下图所示的
我们在内存处理的时候如果要以16
字节对齐,所以所有的Y
的数量要能被16整除,
则638
不能被16
整除,我们需要在每行尾部填充2
个字节动画就是640
,此时该图片的Y stride
为640
字节。
7. 其他
本文为看以下视频的学习笔记
音视频开发零基础系列-图像篇YUV-RGB-上|YUV的格式YUV的采样方式YUV的存储方式RGB 到 YUV的转换
音视频开发零基础系列-图像篇YUV-RGB-下|YUV的格式YUV的采样方式YUV的存储方式RGB 到 YUV的转换