颜色编码格式介绍

颜色编码格式简单分类

  • YUV
    • YUV444
    • YUV 4:2:2
    • YUV 4:2:0
      • YUV420sp
        • NV12
        • NV21
      • YUV420p
        • YU12
        • YV12
  • 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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值