1.RGB彩色原理
2.YUV
3.像素,分辨率,位深,帧率,码率,Stride跨距
分辨率为 638 x 480 的 RGB24 格式的图片 , 内存处理时 以 16 字节对齐 ;
RGB24 格式中 R ( 红 ) / G ( 绿 ) / B ( 蓝 ) 每个分量占用 8 位 ( 1 字节 ) , 一个像素总共占用 24 位 ( 3 字节 ) ;
每一行的 实际像素 所占用的内存是 638 * 3 = 1914 字节 ;
需要以 16 字节对齐 , 最后一个字节占用的实际 内存大小 是 1914 % 16 = 10 字节 ,
因此 还需要 额外补充 16 - 10 = 6 字节的填充字节 ,
最终达到 638 * 3 + 6 = 1920 字节
4.YUV内存对齐问题 Stride跨距
YUV 跨距对齐 概念
YUV 跨距 ( Stride ) 对齐 是 图像处理 过程中 内存对齐 概念 ;
在 处理 YUV 格式的 图像 时 , 系统 或 硬件设备 要求 , YUV 图像的 每一行 像素 , 在 内存空间 中 需要 进行对齐操作 ;
Stride 跨距对齐 是 为了满足 特定 的 内存访问模式 的要求 , 有些系统要求 进行 跨距对齐 ,
要求 YUV 图像 的 每行内存宽度 必须是 " 内存对齐长度 " 的整数倍 ,
如果 YUV 图像 的 每行内存宽度 不是 " 内存对齐长度 " 的整数倍 , 就需要在 每行 的末尾添加 填充字节 , 以达到 跨距对齐 要求 ;
被填充的字节 , 没有实际意义 , 不包含图像数据 ;
这个 " 内存对齐长度 " 可能是 16 字节 / 32 字节 / 64 字节 等 ;
举例说明:
要求 内存处理 YUV 图像时 , 以 16 字节对齐 , 现在有一张图片 638 x 480 像素的 YUV420P 图片 ;
举例1:YUV420P 数据存储
YUV420P 数据存储 格式如下图所示 , 不同类型的分量放在不同的数组中 ,
YUV 4:4:4采样,每一个Y对应一组UV分量。
YUV 4:2:2采样,每两个Y共用一组UV分量。
YUV 4:2:0采样,每四个Y共用一组UV分量
Y 灰度值 分量 , 存储在 最上面的数组中 , 在下图的 Y0 ~ Y15 的 灰度值 就是存放在一个数组中 ;
U 色度值 分量 , 存储在 中间数组中 , 在下图的 U0 ~ U3 的 色度值 就是存放在一个数组中 , U 的个数只有 4 个 , 是 Y 分量个数的一半 ;
V 色度值 分量 , 存储在 最下面的数组中 , 在下图的 V0 ~ V3 的 色度值 就是存放在一个数组中 , V 分量 的个数只有 4 个 , 是 Y 分量 个数的一半 ;
上面的 YUV 图像 内存数据 中 ,
Y0 , Y1 , Y4 , Y5 灰度值 使用 U0V0 色度值 , 4 个像素用了 6 字节 , 一个像素 1.5 字节 ;
Y2 , Y3 , Y6 , Y7 灰度值 使用 U1V1 色度值 , 4 个像素用了 6 字节 , 一个像素 1.5 字节 ;
Y8 , Y9 , Y12 , Y13 灰度值 使用 U2V2 色度值 , 4 个像素用了 6 字节 , 一个像素 1.5 字节 ;
Y10 , Y11 , Y14 , Y15 灰度值 使用 U3V3 色度值 , 4 个像素用了 6 字节 , 一个像素 1.5 字节 ;
图片的像素格式是 638 x 480 像素 ;
在上面 YUV420P 格式的图像中 , 每一行 每个像素 只占 1 字节 , 那么 该图像 在内存中 , 每行的长度 是 638 字节 ;
每一行的 实际像素 所占用的内存是 638 字节 ;
需要以 16 字节对齐 , 最后一个字节占用的实际 内存大小 是 638 % 16 = 14 字节 ,
因此 每行 还需要 额外补充 16 - 14 = 2 字节的填充字节 ,
最终达到 638 + 2 = 640 字节 ;
举例2:YUV420的内存计算
width * hight =Y(总和)
U = Y / 4 V = Y / 4
所以YUV420 数据在内存中的长度是 width * hight * 3 / 2(即一个YUV是1.5个字节),所以计算采集的数据大小:width * hight * 1.5*frame*time
以720×488大小图象YUV420 planar为例,
其存储格式是: 共大小为720×480×3 × 1.5字节,
分为三个部分:Y,U和V
Y分量: (720×480)个字节
U(Cb)分量:(720×480 × 1/4)个字节
V(Cr)分量:(720×480 × 1/4)个字节
三个部分内部均是行优先存储,三个部分之间是Y,U,V 顺序存储。
即YUV数据的0--720×480字节是Y分量值,
720×480--720×480×5/4字节是U分量
720×480×5/4 --720×480×3/2字节是V分量。
5.YUV数据存储格式
6.画面绿屏
这里涉及到两个知识:一个知识点是解码,当“视频包队列” 被 "视频解码" 的时候,理论上会解码出正常的YUV数据,
一个知识点 是 从YUV数据 转码成 RGB。
YUV(256 级别) 可以从8位RGB 直接计算:
Y = 0.299*R + 0.587*G + 0.114*B;
U = -0.169*R -0.331*G + 0.5 *B ;
V = 0.5 *R -0.419*G -0.081*B;
反过来,RGB 也可以直接从YUV (256级别) 计算:
R = Y + 1.402 (Y-128)
G = Y -0.34414 (U-128) -0.71414 (U-128)
B = Y + 1.772 (V-128)
当解码失败的时候,YUV 的三个值都会变成0.
因为解码失败时YUV分量都填为0值,然后根据公式:
R = 1.402 * (-128) = -126.598
G = -0.34414*(-128) -0.71414*(-128) = 44.04992 + 91.40992 = 135.45984
B = 1.772 * (-128) = -126.228
7.H264编码原理
8.H264 I,P,B帧的关系
9.音视频同步:
AUdio Master 同步视频到音频
video master 同步音频到视频
external clock master:同步音频和视频 到外部时钟
一般情况下 audio master > external clock master > video master
10 DTS
decoding time stamp 解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据
一般来讲,我们如果不做算法方面的工作,一般不需要关注DTS
11 PTS
presentation time stamp 显示时间戳,这个时间戳来告诉播放器该在什么时候显示这一帧的数据
主要是关注PTS,这一帧数据可能是音频数据,也可能是视频数据。
图片像素(Pixel)
一张图片是由多少个 像素 构成的。
例如一张图片是由60x50组成的。
位深度 bit depth
RGB表示法
红(Red)、绿(Green)、蓝(Blue)
除了24bit,常见的位深度还有:
- 1bit:2种颜色,黑白两色
- 3bit:8种颜色,用于大部分早期的电脑显示器,红绿蓝各占1位
- 8bit:256种颜色,用于最早期的彩色Unix工作站,红色占3位、绿色占3位、蓝色占2位
- 16bit:红色占5位、蓝色占5位、绿色占6位
-
24bit:也被称为是:真彩色(True Color),也就是常说的24位真彩
- 32bit:基于24位,增加8个位的透明通道
- 可以表示带有透明度的颜色
- 比如CSS中的rgba(255, 0, 0, 0.5)表示50%透明度的红色
YUV 表示法:
Y、U、V三个分量组成,现在通常说的YUV指的是YCbCr。
- Y:表示亮度(Luminance、Luma),占8bit(1字节)
- Cb、Cr:表示色度(Chrominance、Chroma)
- Cb(U):蓝色色度分量,占8bit(1字节)
- Cr(V):红色色度分量,占8bit(1字节)
YUV和RGB 比较:体积更小
YUV的优势是比 RGB拥有更小的体积
- 如果使用RGB
- 比如RGB888(R、G、B每个分量都是8bit)
- 1个像素占用24bit(3字节)
- 如果使用YUV
- 1个像素可以减小至平均只占用12bit(1.5字节)
- 体积为RGB888的一半
YUV 的采样格式
采样格式通常用A:B:C的形式来表示,比如4:4:4、4:2:2、4:2:0等,其中我们最需要关注的是4:2:0。
YUV 的存储格式
YUV的存储格式可以分为3大类:
- Planar(平面)
- Y、U、V分量分开单独存储
- 名称通常以字母p结尾
- Semi-Planar(半平面)
- Y分量单独存储,U、V分量交错存储
- 名称通常以字母sp结尾
- Packed(紧凑)
- 或者叫Interleaved (交错)
- Y、U、V分量交错存储
YUV 的常用类型,结合采样格式和存储格式
4:4:4 表示 :每一个Y ,对应一组UV
4:2:2 表示:每两个Y,对应一组UV
4:2:0表示:每4个Y,对应一组UV
YUV存储格式带来的问题-YUV Stride对齐问题--todo?
比如分辨率 638x480的YUV420P图像,我们在内存处理的时候如果要以16字节对齐(),则638不能被16整除,我们需要在每行尾部填充2个字节。变成640,此时,该图片的YUV分量中的Y stride为640字节,对应U 和 V 都320字节,
音视频开发进阶|图像位深、宽高、跨距 - 知乎
4:4:4
- I444
Y Y Y Y
Y Y Y Y
U U U U
U U U U
V V V V
V V V V
- YV24
Y Y Y Y
Y Y Y Y
V V V V
V V V V
U U U U
U U U U
- NV24
Y Y Y Y
Y Y Y Y
U V U V U V U V
U V U V U V U V
- NV42
Y Y Y Y
Y Y Y Y
V U V U V U V U
V U V U V U V U
4:2:2
- I422
Y Y Y Y
Y Y Y Y
U U
U U
V V
V V
- YV16
Y Y Y Y
Y Y Y Y
V V
V V
U U
U U
- NV16
Y Y Y Y
Y Y Y Y
U V U V
U V U V
- NV61
Y Y Y Y
Y Y Y Y
V U V U
V U V U
- UYVY
U Y V Y U Y V Y
U Y V Y U Y V Y
- YUYV
Y U Y V Y U Y V
Y U Y V Y U Y V
- YVYU
Y V Y U Y V Y U
Y V Y U Y V Y U
4:2:0
I420 (YUV420P)
- 大多数视频解码器以I420格式输出原始图片
Y Y Y Y
Y Y Y Y
U U
V V
- YV12
Y Y Y Y
Y Y Y Y
V V
U U
- NV12
Y Y Y Y
Y Y Y Y
U V U V
- NV21
Y Y Y Y
Y Y Y Y
V U V U
总结
图片有2个要素,视频有3个要素。
像素,RGB/YUV类型,fps(每秒播放多少个图片)