颜色编码格式简单分类
- YUV
- YUV444
- YUV 4:2:2
- YUV 4:2:0
- YUV420sp
- NV12
- NV21
- YUV420p
- YU12
- YV12
- YUV420sp
- RGB
分级介绍
YUV,分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传输,所以用YUV方式传送占用极少的频宽。
YUV格式的两大类
- planar : 先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
- packed : 每个像素点的Y,U,V是连续交*存储的。
常用的YUV格式:
- YUV444: 每一个Y对应一组UV分量, 1 像素的rgb数据占用的内存为 8 + 8 + 8 = 24bit = 3byte;
- YUV422: 每两个Y共用一组UV分量, 1 像素的rgb数据占用的内存为 8 + 4 + 4 = 16bit = 2byte;
- YUV420: 每四个Y共用一组UV分量, 1 像素的rgb数据占用的内存为 8 + 2 + 2 = 12bit = 1.5byte;
YUV420p
YUV420p:又叫planer平面模式,Y ,U,V分别再不同平面,也就是有三个平面。
- YU12 (I420, 安卓的模式) : 存储顺序是先存Y,再存U,最后存V。 如:YYYYYYYYUUVV;
- YV12: 存储顺序是先存Y,再存U,最后存V。 如: YYYYYYYYVVUU;
YUV420sp
YUV420sp:又叫bi-planer或two-planer双平面,Y一个平面,UV在同一个平面交叉存储.
- NV12 (iOS中只有这个模式) : 存储顺序是先存Y,再UV交替存储。 如:YYYYYYYYUVUV;
- NV21(安卓的模式): 存储顺序是先存Y, 再VU交替存储。 如: YYYYYYYYVUVU;
计算大小
Y分量 width * height = Y(总和)
U分量 Y/4 = U; V分量 = Y/ 4;
所以YUV420的数据在内存中的长度是 width * height * 3 / 2 (一个YUV 占用 1.5个字节); 所以采集一个数据的大小是 width * height * 1.5 * 帧率 * time;
一般来说,直接采集到的视频数据是RGB24的格式,RGB24一帧的大小size=width×heigth×3字节;
所以通常在采集到RGB24后, 需要对这个格式的额数据进行一次压缩处理, 将图像的颜色空间由RGB 转为 YUV; 这样不仅可以减少数据量, 而且X264在进行编码的时候, 需要标准的YUV420格式; 然后 通过 一些编码算法, 数据会大大减小, 然后 将编码后的数据打包, 进行RTP实时传输, 在接收端 ,接收到数据后进行解码之后通过OpenGL 渲染到屏幕上, 或者将YUV420转为RGB24后渲染到屏幕上;
在iOS中
在iOS中 使用 相机 或者 创建解码器, 或者创建渲染缓冲区; 都需要指定 PixelFormatType; 但是iOS 中硬解码默认只支持NV12的格式, 在PixelFormatType的枚举中, 一共有以下四种
- kCVPixelFormatType_420YpCbCr8Planar
- kCVPixelFormatType_420YpCbCr8PlanarFullRange
- kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
- kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
字面上可以看出, 前连个是YUV420p的格式, 就是三个平面的 后面两个是两个平面的, 或者是 调用 CVPixelBufferGetPlaneCount(pixel)函数获取平面数量, 也会得到相同的结论; 但是范围缩小到后两个;
假如视频的 分辨率是 480*640 (差别是 计算的步长不一样) 最后确定使用 kCVPixelFormatType_420YpCbCr8BiPlanarFullRange;
- kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange : Y和UV的步长是480(实际长度,未补齐) Y的行宽是640,UV行宽是320
- kCVPixelFormatType_420YpCbCr8BiPlanarFullRange : Y和UV的步长是512(采用了64字节对齐 非对齐的补0) Y的行宽是640,UV行宽是320