整理自博客

概述

由于人眼对亮度信息敏感,对颜色没有那么敏感,因此一张RGB的图片可以通过转换成YUV进行压缩。
本文分析下YUV码流的存储格式,YUV码流的存储格式与采样格式息息相关。总的来讲,YUV存储格式主要分为两种:

  1. planar 平面格式
    先连续存储所有像素点的 Y 分量,然后存储 U 分量,最后是 V 分量。
  2. packed 打包格式
    指每个像素点的 Y、U、V 分量是连续交替存储的。
    根据采样方式和存储格式的不同,就有了多种 YUV 格式。这些格式主要是基于 YUV 4:2:2 和 YUV 4:2:0 采样。

常见的基于 YUV 4:2:2 采样的格式有以下几种:YUYV、UYVY、YUV422P

常见的基于 YUV 4:2:0 采样的格式如下表:YUV420P、YUV420SP

基于YUV4:2:2采样的格式

YUV 4:2:2 采样规定了 Y 和 UV 分量按照 2: 1 的比例采样,两个 Y 分量公用一组 UV 分量。

YUYV格式

YUYV 格式是采用打包格式进行存储的,指每个像素点都采用 Y 分量,但是每隔一个像素采样它的 UV 分量,排列顺序如下:
Y0 UO Y1 V0 Y2 U2 Y3 V2
Y0 和 Y1 公用 U0 V0 分量,Y2 和 Y3 公用 U2 V2 分量

UYVY格式

UYVY 格式也是采用打包格式进行存储,它的顺序和 YUYV 相反,先采用 U 分量再采样 Y 分量,排列顺序如下:
U0 Y0 V0 Y1 U2 Y2 V2 Y3
Y0 和 Y1 公用 U0 V0 分量,Y2 和 Y3 公用 U2 V2 分量
根据 UV 和 Y 的顺序还有其他格式,比如,YVYU 格式,VYUY 格式等等,原理大致一样了。

YUV422P格式

YUV 422P 格式,又叫做 I422,采用的是平面格式进行存储,先存储所有的 Y 分量,再存储所有的 U 分量,再存储所有的 V 分量。

基于YUV 4:2:0采样的格式

基于 YUV 4:2:0 采样的格式主要有 YUV 420P 和 YUV 420SP 两种类型,每个类型又有两种具体的格式。

  • YUV 420P 类型
    • YU12 格式
    • YV12 格式
  • YUV 420SP 类型
    • NV12 格式
    • NV21 格式

YUV 420P 和 YUV 420SP 都是基于 Planar 平面格式 进行存储的。
先存储所有的 Y 分量后, YUV420P 类型就会先存储所有的 U 分量或者 V 分量。

YUV420P的格式

而YUV420SP 则是按照 UV 或者 VU 的交替顺序进行存储了。
YUV420SP的格式

YU12和YV12格式

YU12 和 YV12 格式都属于 YUV 420P 类型,即先存储 Y 分量,再存储 U、V 分量,区别在于:YU12 是先 Y 再 U 后 V,而 YV12 是先 Y 再 V 后 U 。
YV 12 的存储格式

YU 12 又称作 I420 格式,它的存储格式就是把 V 和 U 反过来了。

YUV420P码流的表现

NV12和NV21格式

NV12 和 NV21 格式都属于 YUV420SP 类型。它也是先存储了 Y 分量,但接下来并不是再存储所有的 U 或者 V 分量,而是把 UV 分量交替连续存储。

其在码流中的表现形式为:
YUV420SP码流的表现

注意

NV12是iOS中有的模式,它的存储顺序是先存Y分量,再进行UV交替存储。

NV21是Android中有的模式,它的存储顺序是先存Y分量,再VU交替存储。高通一般用这种模式。