概述
之前介紹了YUV碼流的采樣格式,下面分析下YUV碼流的存儲格式,YUV碼流的存儲格式與采樣格式息息相關。總的來講,YUV存儲格式主要分為兩種:
- planar 平面格式
- 指先連續存儲所有像素點的 Y 分量,然后存儲 U 分量,最后是 V 分量。
- packed 打包模式
- 指每個像素點的 Y、U、V 分量是連續交替存儲的。
根據采樣方式和存儲格式的不同,就有了多種 YUV 格式。這些格式主要是基於 YUV 4:2:2 和 YUV 4:2:0 采樣。
常見的基於 YUV 4:2:2 采樣的格式如下表:

常見的基於 YUV 4:2:0 采樣的格式如下表:

更多的 YUV 格式信息參考這里:YUV pixel formats
基於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 分量,而 YUV420SP 則是按照 UV 或者 VU 的交替順序進行存儲了,具體查看看下圖:
YUV420P 的格式:

其在碼流中的表現形式為:

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 反過來了。
【NV12和NV21格式】
NV12 和 NV21 格式都屬於 YUV420SP 類型。它也是先存儲了 Y 分量,但接下來並不是再存儲所有的 U 或者 V 分量,而是把 UV 分量交替連續存儲。

需要注意的是,
NV12是iOS中有的模式,它的存儲順序是先存Y分量,再YV進行交替存儲。
NV21是Android中有的模式,它的存儲順序是先存Y分量,再VU交替存儲。
參考鏈接:
