02.视频数据源之YUV、RGB
视频基础
视频基本概念
视频帧
常见有 I帧
(关键帧,含完整画面,所以数据量大)、P帧
(前向参考帧,参考前面 I帧
编码的图像信息)、B帧
(双向预测帧,参考前面 I帧
、前面 P帧
和后面 I帧
编码的图像信息);网上看视频时常常遇到拖动进度条出现回退一两秒的情况,因为那个位置的当前帧不是 I帧
,没有完整的画面。
分辨率 图像的大小或尺寸。
RGB 任何彩色图像可由红绿蓝组成。RGB 每一个通道占 8 位,1 个字节内存。每个像素包含一个 RGB,占 3 个字节(如果加上透明度 RGBA 则占 32 位,总共 4 个字节)。如:1920x1080
内存大小=1920 x 1080 x 3=5.9M。
YUV(YcbCr
) Y:亮度;UV:色度和饱和度;wiki YCbCr 介绍。目前大多数都是使用 yuv
格式来表示视频帧的裸流数据。
码率 (比特率) 单位时间内播放媒体(包括视频和音频)的比特数量(bit 的数量)。文件大小计算公式:文件大小(b)= 码率(b/s)x 时间(s)
帧率 (帧数) 画面每秒传输帧数,单位:fps(frame per second)或者 “ 赫兹 “(Hz)。对于人眼感官常用范围在 15~75fps 之间。
刷新率 屏幕在每秒刷新(画面)的次数。单位:赫兹(Hz)。
RGB
什么是 RGB?
RGB 是一种加色模型,它根据光的三原色——红色(Red)
、绿色(Green)
和 蓝色(Blue)
来创建其他颜色。在 RGB 模型中,每个颜色通道各自有一个强度值,通常在计算机中以数字范围从 0 到 255 表示。当三种颜色光以全强度 (255,255,255)
混合时,生成白色光;当三种颜色光都没有 (0,0,0)
时,是黑色。RGB 模型广泛应用于电子显示系统,比如电视、计算机屏幕和手机。
对于一幅图像,一般使用整数表示方法来进行描述,比如计算一张的 RGB_888
图像的大小,可采用如下方式:
色彩:256*256*256=16,777,216
1280×720 * 3B
= 2.637 MB,4 分钟就达到了 15 G 的容量。
假如是一部 90 分钟的电影,每秒 25 帧,则一部电影为
2.637 MB*90 分钟*60 秒*25 FPS= 347.651 GB
RGB 排列
通常的图像像素是按 RGB
顺序进行排列, 但有些图像处理要转成其他顺序, 比如 OpenCV 经常转成 BGR
的排列方式。
 |
YUV
什么是 YUV?
人类视觉系统(HVS
)对亮度比彩色更敏感,所以把 Y 和 UV 单独抽出来,每一个像素点都有一个 Y,4 个 Y 和一组 UV(UV 数量不定)共同绘制 4 个像素点,而 Y 和 UV 的比例不一样就分了多种 取样格式。
 |
YUV 用途: 主要用于视频信号的压缩、传输和存储,和向后相容老式黑白电视。
- 其中 “Y” 表示明亮度(
Luminance
或Luma
),也称灰阶值; - “U” 和 “V” 表示的则是色度(
Chrominance
或Chroma
)
YUV 作用 是描述影像色彩及饱和度,用于指定像素的颜色。
YUV 也是一种颜色编码方法, 它是指将亮度参量(Y: Luminance 或 Luma) 和色度参量(UV: Chrominance 或 Chroma) 分开进行表示的像素编码格式。这样分开的好处就是不但可以避免相互干扰, 没有 UV 信息一样可以显示完整的图像,因而解决了彩色电视与黑白电视的兼容问题;还可以降低色度的采样率而不会对图像质量影响太大, 降低了视屏信号传输时对频宽(带宽) 的要求
YUV 与 RGB 的相互转化
- RGB 转 YUV:
Y = 0.299R + 0.587G + 0.114B U = 0.564(B - Y) V = 0.713(R - Y)
- YUV 转 RGB:
R = Y + 1.402V B = Y + 1.772U G = Y - 0.344U - 0.714V
libyuv,Google 开源的实现各种 YUV 与 RGB 间相互转换、旋转、缩放的库
YUV 取样格式
常见的取样格式有以下 3 种:
 |
- 4:4:4 每 4 个素位置都有 4 个 YUV,内存计算:1920 x 1080 = 1920 x 1080 x 3=5.9M;
- 4:2:2 每 4 个 Y 像素具有 2 个 U 和 2 个 V;内存计算:1920 x 1080 = 1920 x 1080 x (1 + 2/4 + 2/4)=3.9M;
- 4:2:0 每 4 个 Y 像素具有 1 个 U 和 1 个 V,使用在视频领域中应用最广泛。内存计算:1920 x 1080 = 1920 x 1080 x (1 + 1/4 + 1/4)=2.8M;
YUV 存在多种格式,比如 YUV420p
,YUV420sp
等,不同的 YUV 格式的数据在存储时的排列顺序是不一样的,在开发的过程中必须非常注意,否则画面会显示不正常。比如花屏,绿屏等现象。
YUV 数据排列格式
在这里介绍两种格式,一种是 Android 平台特有 NV21
(又称 YUV420SP
),另一种则是其他大部分平台同样的 I420
(又称YUV420P
),这两个取样格式都是 4:2:0,所以说他们两种的数据完全一样,只是放到内存里面的顺序变了。(我们要实现把从 Android 采样 NV21 数据转成 I420 然后推送到服务器。)
NV21(YUV420SP)
- 先把 Y 数据全部排序完;
- UV 数据交替排序完;
 |
I420(YUV420P)
- 先把 Y 数据全部排序完;
- U 数据排序完;
- V 数据排序完;
 |
YUV 数据源的采集(Android 端)
YUV 数据处理 (雷神)
RGB/YUV 视频像素数据处理函数:
- 分离 YUV 420 P 像素数据中的 Y、U、V 分量
- 分离 YUV 444 P 像素数据中的 Y、U、V 分量
- 将 YUV 420 P 像素数据去掉颜色(变成灰度图)
- 将 YUV 420 P 像素数据的亮度减半
- 将 YUV 420 P 像素数据的周围加上边框
- 生成 YUV 420 P 格式的灰阶测试图
- 计算两个 YUV 420 P 像素数据的 PSNR
- 分离 RGB 24 像素数据中的 R、G、B 分量
- 将 RGB 24 格式像素数据封装为 BMP 图像
- 将 RGB 24 格式像素数据转换为 YUV 420 P 格式像素数据
- 生成 RGB 24 格式的彩条测试图