詳解 YUV 格式(I420/YUV420/NV12/NV12/YUV422)
YUV
(Y'CbCr
)是一種像素格式,常見于視頻編碼與靜態(tài)圖像勺鸦。與 RGB
格式(紅-綠-藍(lán))相反荚孵,YUV 分別由一個稱為 Y
(相當(dāng)于灰度)的“亮度”分量(Luminance or Luma)和兩個稱為 U
(藍(lán)色投影 Cb
)和 V
(紅色投影 Cr
)的“色度”分量(Chrominance or Chroma)表示爷辙,由此得名左权。
僅有 Y 分量而沒有 UV 分量信息拘领,一樣可以顯示完整的黑白(灰度)圖像藕帜,解決了模擬信號電視黑白與彩色的兼容問題烫罩。
采樣
色度通道(UV)的采樣率可以低于亮度通道(Y),而不會顯著降低感知質(zhì)量耘戚。一種稱為 “A:B:C” 的表示法用于描述相對于 Y 采樣嗡髓, U 和 V 的頻率:
- 4:4:4 表示不降低色度(UV)通道的采樣率。每個 Y 分量對應(yīng)一組 UV 分量收津。
- 4:2:2 表示 2:1 水平下采樣饿这,沒有垂直下采樣。每兩個 Y 分量共享一組 UV 分量撞秋。
- 4:2:0 表示 2:1 水平下采樣长捧,同時 2:1 垂直下采樣。每四個 Y 分量共享一組 UV 分量吻贿。
- 4:1:1 表示 4:1 水平下采樣串结,沒有垂直下采樣。每四個 Y 分量共享一組 UV 分量舅列。4:1:1 采樣比其他格式少見肌割,本文不再詳細(xì)討論。
下圖顯示了如何針對每個下采樣率采樣色度帐要。亮度樣本用十字表示把敞,色度樣本用圓圈表示。
存儲格式
YUV 在存儲上通常分為平面格式(Planar
)榨惠,半平面格式(Semi-Planar
)以及打包格式(Packed
)奋早。
Planar 平面格式
平面格式有時也稱為三面格式(Triplanar
),即 Y, U, V 三個分量各自使用單獨(dú)的數(shù)組保存赠橙,這種三平面分離的格式比較方便視頻編碼耽装。
YU12 (I420)
- 4:2:0 Formats, 12 Bits per Pixel, 3 Planars
YU12
即 I420
,也叫 IYUV
期揪,屬于 YUV420P
格式掉奄。三個平面,分別存儲 Y U V 分量横侦。每四個 Y 分量共享一組 UV 分量挥萌。U绰姻、V 平面的 strides, width 和 height 都是 Y 平面的一半,因此一個像素 12 bits引瀑,內(nèi)存排列如下圖所示:
從圖中可看出狂芋,U、V 平面的每行字節(jié)數(shù)(strides)憨栽、高(height)都是 Y 平面的一半帜矾。
I420
是音視頻開發(fā)中常用的一種格式。
YV12
- 4:2:0 Formats, 12 Bits per Pixel, 3 Planars
YV12
與 I420
幾乎一樣屑柔,僅改變了 U, V 平面的順序屡萤。內(nèi)存排列如下圖所示:
J420
- 4:2:0 Formats, 12 Bits per Pixel, 3 Planars
J420
與 I420
完全相同,但具有完整范圍(0-255掸宛,full range)的亮度(Y)分量死陆,而不是有限范圍(16-240,limited range唧瘾,在 iOS 上也叫做 video range)措译。色度(UV)分量與 I420 中的完全相同。
IMC1
- 4:2:0 Formats, 16 Bits per Pixel, 3 Planars
IMC1
與 I420
類似饰序,U, V 平面的寬(width)领虹、高(height)是 Y 平面的一半,但是每行字節(jié)數(shù)(strides)與 Y 平面一致求豫,因此 U, V 平面在內(nèi)存上會有留空(padding)塌衰,因此一個像素 16 bits,如圖所示:
IMC3
- 4:2:0 Formats, 16 Bits per Pixel, 3 Planars
IMC3
與 IMC1
幾乎一樣蝠嘉,僅改變了 U, V 平面的順序最疆。內(nèi)存排列如下圖所示:
I422
- 4:2:2 Formats, 16 Bits per Pixel, 3 Planars
I422
屬于 YUV422P
格式。三個平面蚤告,分別存儲 Y U V 分量肚菠。每兩個 Y 分量共享一組 UV 分量。U罩缴、V 平面的 strides, width 是 Y 平面的一半,但 height 與 Y 平面一致层扶,因此一個像素 16 bits箫章,內(nèi)存排列如下圖所示:
從圖中可看出,U镜会、V 平面的每行字節(jié)數(shù)(strides)是 Y 平面的一半檬寂,高(height)與 Y 平面一致。
J422
- 4:2:2 Formats, 16 Bits per Pixel, 3 Planars
J422
與 I422
完全相同戳表,但具有完整范圍(0-255桶至,full range)的亮度(Y)分量昼伴,而不是有限范圍(16-240,limited range镣屹,在 iOS 上也叫做 video range)圃郊。色度(UV)分量與 I420 中的完全相同。
Semi-Planar 半平面格式
半平面格式具有兩個平面而不是三個平面女蜈,一個平面存儲亮度(Y)分量持舆,另一個平面存儲兩個色度(UV)分量。有時也將它們稱為雙平面格式(BiPlanar
)伪窖。
NV12
- 4:2:0 Formats, 12 Bits per Pixel, 2 Planars
NV12
屬于 YUV420SP
格式逸寓。兩個平面,分別存儲 Y 分量 和 UV 分量覆山。其中 UV 分量共用一個平面并且以 U, V, U, V 的順序交錯排列竹伸。每四個 Y 分量共享一組 UV 分量。
UV 平面的 strides, width 與 Y 平面一樣長簇宽,但 height 僅為 Y 平面的一半勋篓。因此一個像素 12 bits,內(nèi)存排列如下圖所示:
從圖中可看出晦毙,UV 平面的每行字節(jié)數(shù)(strides)與 Y 平面一致生巡,高(height)是 Y 平面的一半。
NV12
是 iOS 相機(jī)(AVCaptureOutput
)可直接輸出的兩種視頻幀格式之一见妒,另外一種是 BGRA32
(kCVPixelFormatType_32BGRA
)孤荣。
在 iOS 上,NV12
還分為 Full Range (0-255, kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
) 和 Video Range (16-240, kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange
)须揣,區(qū)別僅為亮度(Y)分量的取值范圍盐股,一般而言,F(xiàn)ull Range 適用于靜態(tài)圖像(拍照)耻卡,Video Range 適用于視頻采集(攝像)疯汁。
NV21
- 4:2:0 Formats, 12 Bits per Pixel, 2 Planars
NV21
屬于 YUV420SP
,與 NV12
幾乎一致卵酪,區(qū)別是 UV 平面中 U 與 V 的排列順序顛倒幌蚊,以 V, U, V, U 的順序交錯排列,內(nèi)存排列如圖所示:
NV21
是 Android 相機(jī)(Camera
)默認(rèn)的輸出格式溃卡。
Packed 打包格式
打包格式通常只有一個平面溢豆,所有亮度(Y)和色度(UV)數(shù)據(jù)都交織在一起。有點類似于 RGB 格式瘸羡,只是使用了不同的色彩空間漩仙。
打包格式在網(wǎng)絡(luò)攝像頭中較為常見。硬件設(shè)備使用多平面格式效率較低,因為每個像素需要多次內(nèi)存訪問队他。而打包格式由于僅一個平面卷仑,訪問內(nèi)存的開銷較小。
AYUV
- 4:4:4 Formats, 32 Bits per Pixel
AYUV 是 Packed 打包格式麸折,其中每個像素編碼為四個連續(xù)字節(jié)锡凝,每個像素在內(nèi)存中按照 V, U, Y, A 的順序排列(A 指 alpha 通道),如下圖所示:
YUYV (V422 / YUY2 / YUNV)
- 4:2:2 Formats, 16 Bits per Pixel
YUYV
通常也稱作 V422
磕谅、YUY2
私爷、YUNV
YUY2 是 Packed 打包格式,其中兩個像素共用一組 UV 分量膊夹,內(nèi)存中按照 Y U Y V 的順序排列衬浑,如下圖所示:
UYVY (Y422 / UYNV)
- 4:2:2 Formats, 16 Bits per Pixel
UYVY
通常也稱作 Y422
、UYNV
UYVY
與 YUYV
類似放刨,只是亮度(Y)分量與色度(UV)分量排列順序顛倒工秩,如下圖所示: