標籤:
YUV格式有兩大類:planar和packed。
對於planar的YUV格式。先連續儲存全部像素點的Y。緊接著儲存全部像素點的U。隨後是全部像素點的V。
對於packed的YUV格式,每一個像素點的Y,U,V是連續交*儲存的。
YUV。分為三個分量,“Y”表示明亮度(Luminance或Luma)。也就是灰階值;而“U”和“V” 表示的則是色度(Chrominance或Chroma),作用是描寫敘述影像色彩及飽和度,用於指定像素的顏色。
與我們熟知的RGB類似。YUV也是一種顏色編碼方法,主要用於電視系統以及類比視頻領域,它將亮度資訊(Y)與色多媒體訊息息(UV)分離,沒有UV資訊一樣能夠顯示完整的映像,僅僅只是是黑白的,這種設計非常好地攻克了彩色電視機與黑白電視的相容問題。
而且,YUV不像RGB那樣要求三個獨立的視頻訊號同一時候傳輸,所以用YUV方式傳送佔用極少的頻寬。
YUV碼流的儲存格式事實上與其採樣的方式密切相關,主流的採樣方式有三種,YUV4:4:4。YUV4:2:2,YUV4:2:0,關於其具體原理。能夠通過網上其他文章瞭解。這裡我想強調的是怎樣依據其採樣格式來從碼流中還原每一個像素點的YUV值。由於僅僅有正確地還原了每一個像素點的YUV值。才幹通過YUV與RGB的轉換公式提取出每一個像素點的RGB值,然後顯示出來。
用三個圖來直觀地表示採集的方式吧,以黑點表示採樣該像素點的Y分量。以空心圓圈表示採用該像素點的UV分量。
先記住以下這段話,以後提取每一個像素的YUV分量會用到。
- YUV 4:4:4採樣,每個Y相應一組UV分量。
- YUV 4:2:2採樣。每兩個Y共用一組UV分量。
- YUV 4:2:0採樣,每四個Y共用一組UV分量。
2. 儲存方式
以下我用圖的形式給出常見的YUV碼流的儲存方式,並在儲存方式後面附有取樣每一個像素點的YUV資料的方法,當中,Cb、Cr的含義等同於U、V。
(1) YUVY 格式 (屬於YUV422)
YUYV為YUV422採樣的儲存格式中的一種,相鄰的兩個Y共用其相鄰的兩個Cb、Cr。分析,對於像素點Y‘00、Y‘01 而言。其Cb、Cr的值均為 Cb00、Cr00,其它的像素點的YUV取值依次類推。 (2) UYVY 格式 (屬於YUV422)UYVY格式也是YUV422採樣的儲存格式中的一種,僅僅只是與YUYV不同的是UV的排列順序不一樣而已。還原其每一個像素點的YUV值的方法與上面一樣。 (3) YUV422P(屬於YUV422) YUV422P也屬於YUV422的一種。它是一種Plane模式,即平面模式,並非將YUV資料交錯儲存。而是先存放全部的Y分量,然後儲存全部的U(Cb)分量。最後儲存全部的V(Cr)分量,如所看到的。其每個像素點的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即兩個Y共用一個UV。
比方,對於像素點Y‘00、Y‘01 而言。其Cb、Cr的值均為 Cb00、Cr00。
(4)YV12,YU12格式(屬於YUV420)
YU12和YV12屬於YUV420格式,也是一種Plane模式,將Y、U、V分量分別打包,依次儲存。其每個像素點的YUV資料提取遵循YUV420格式的提取方式,即4個Y分量共用一組UV。注意,中,Y‘00、Y‘01、Y‘10、Y‘11共用Cr00、Cb00。其它依次類推。
(5)NV12、NV21(屬於YUV420)
NV12和NV21屬於YUV420格式,是一種two-plane模式,即Y和UV分為兩個Plane。可是UV(CbCr)為交錯儲存,而不是分為三個plane。其提取方式與上一種類似,即Y‘00、Y‘01、Y‘10、Y‘11共用Cr00、Cb00
YUV420 planar資料。 以720×488大小圖象YUV420 planar為例。
其儲存格式是: 共大小為(720×480×3>>1)位元組,
分為三個部分:Y,U和V
Y分量: (720×480)個位元組
U(Cb)分量:(720×480>>2)個位元組
V(Cr)分量:(720×480>>2)個位元組
三個部分內部均是行優先儲存,三個部分之間是Y,U,V 順序儲存。
即YUV資料的0--720×480位元組是Y分量值。
720×480--720×480×5/4位元組是U分量
720×480×5/4 --720×480×3/2位元組是V分量。
4 :2: 2 和4:2:0 轉換:
最簡單的方式:
YUV4:2:2 ---> YUV4:2:0 Y不變。將U和V訊號值在行(垂直方向)在進行一次隔行抽樣。 YUV4:2:0 ---> YUV4:2:2 Y不變,將U和V訊號值的每一行分別拷貝一份形成連續兩行資料。
在YUV420中,一個像素點相應一個Y。一個4X4的小方塊相應一個U和V。對於全部YUV420映像。它們的Y值排列是全然同樣的,由於僅僅有Y的映像就是灰階映像。YUV420sp與YUV420p的資料格式它們的UV排列在原理上是全然不同的。
420p它是先把U存放完後。再存放V,也就是說UV它們是連續的。而420sp它是UV、UV這樣交替存放的。
(見) 有了上面的理論。我就能夠準確的計算出一個YUV420在記憶體中存放的大小。
width * hight =Y(總和) U = Y / 4 V = Y / 4
所以YUV420 資料在記憶體中的長度是 width * hight * 3 / 2,
如果一個解析度為8X4的YUV映像,它們的格式例如以:
YUV420sp格式例如以
YUV420p資料格式例如以
旋轉90度的演算法:
public static void rotateYUV240SP(byte[] src,byte[] des,int width,int height)
{
int wh = width * height;
//旋轉Y
int k = 0;
for(int i=0;i<width;i++) {
for(int j=0;j<height;j++)
{
des[k] = src[width*j + i];
k++;
}
}
for(int i=0;i<width;i+=2) {
for(int j=0;j<height/2;j++)
{
des[k] = src[wh+ width*j + i];
des[k+1]=src[wh + width*j + i+1];
k+=2;
}
}
}
YV12和I420的差別 一般來說。直接採集到的視頻資料是RGB24的格式,RGB24一幀的大小size=width×heigth×3 Bit,RGB32的size=width×heigth×4,假設是I420(即YUV標準格式4:2:0)的資料量是 size=width×heigth×1.5 Bit。
在採集到RGB24資料後,須要對這個格式的資料進行第一次壓縮。即將映像的色彩空間由RGB2YUV。由於,X264在進行編碼的時候須要標準的YUV(4:2:0)。
可是這裡須要注意的是,儘管YV12也是(4:2:0),可是YV12和I420的卻是不同的,在儲存空間上面有些區別。
例如以下: YV12 : 亮度(行×列) + U(行×列/4) + V(行×列/4)
I420 : 亮度(行×列) + V(行×列/4) + U(行×列/4)
能夠看出。YV12和I420基本上是一樣的,就是UV的順序不同。
繼續我們的話題,經過第一次資料壓縮後RGB24->YUV(I420)。這樣,資料量將降低一半,為什麼呢?呵呵,這個就太基礎了。我就不多寫了。相同,假設是RGB24->YUV(YV12),也是降低一半。可是,儘管都是一半,假設是YV12的話效果就有非常大損失。然後,經過X264編碼後,資料量將大大降低。將編碼後的資料打包,通過RTP即時傳送。到達目的地後。將資料取出,進行解碼。完畢解碼後,資料仍然是YUV格式的。所以。還須要一次轉換,這樣windows的驅動才幹夠處理,就是YUV2RGB24。
YUY2 是 4:2:2 [Y0 U0 Y1 V0]
yuv420p 和 YUV420的差別 在儲存格式上有差別yuv420p:yyyyyyyy uuuuuuuu vvvvv yuv420: yuv yuv yuv
YUV420P。Y,U,V三個分量都是平面格式,分為I420和YV12。I420格式和YV12格式的不同處在U平面和V平面的位置不同。在I420格式中,U平面緊跟在Y平面之後,然後才是V平面(即:YUV)。但YV12則是相反(即:YVU)。
YUV420SP, Y分量平面格式,UV打包格式, 即NV12。
NV12與NV21類似。U 和 V 交錯排列,不同在於UV順序。
I420: YYYYYYYY UU VV =>YUV420P
YV12: YYYYYYYY VV UU =>YUV420P
NV12: YYYYYYYY UVUV =>YUV420SP
NV21: YYYYYYYY VUVU =>YUV420SP
著作權聲明:本文博主原創文章。部落格,未經同意不得轉載。
照片詳細解釋YUV420資料格式