分類:目錄(?)[-]
NameDescriptionV4L2_PIX_FMT_NV12 ('NV12'), V4L2_PIX_FMT_NV21 ('NV21')
Name
DescriptionThese are two-plane versions of the YUV 4:2:0 format. The three components are separated into two sub-images or planes. The Y plane is first. The Y plane has one byte per pixel. For If the Y plane has pad bytes after each row, then the CbCr plane has as many pad bytes after its rows. Example 2.23. Byte Order. Each cell is one byte.
Color Sample Location.
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
YUV格式有兩大類:planar和packed。對于planar的YUV格式,先連續(xù)存儲所有像素點的Y,緊接著存儲所有像素點的U,隨后是所有像素點的V。對于packed的YUV格式,每個像素點的Y,U,V是連續(xù)交*存儲的。
YUV,分為三個分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用于指定像素的顏色。
與我們熟知的RGB類似,YUV也是一種顏色編碼方法,主要用于電視系統(tǒng)以及模擬視頻領(lǐng)域,它將亮度信息(Y)與色彩信息(UV)分離,沒有UV信息一樣可以顯示完整的圖像,只不過是黑白的,這樣的設(shè)計很好地解決了彩色電視機與黑白電視的兼容問題。并且,YUV不像RGB那樣要求三個獨立的視頻信號同時傳輸,所以用YUV方式傳送占用極少的頻寬。
YUV碼流的存儲格式其實與其采樣的方式密切相關(guān),主流的采樣方式有三種,YUV4:4:4,YUV4:2:2,YUV4:2:0,關(guān)于其詳細(xì)原理,可以通過網(wǎng)上其它文章了解,這里我想強調(diào)的是如何根據(jù)其采樣格式來從碼流中還原每個像素點的YUV值,因為只有正確地還原了每個像素點的YUV值,才能通過YUV與RGB的轉(zhuǎn)換公式提取出每個像素點的RGB值,然后顯示出來。
用三個圖來直觀地表示采集的方式吧,以黑點表示采樣該像素點的Y分量,以空心圓圈表示采用該像素點的UV分量。

先記住下面這段話,以后提取每個像素的YUV分量會用到。
YUV 4:4:4采樣,每一個Y對應(yīng)一組UV分量。YUV 4:2:2采樣,每兩個Y共用一組UV分量。 YUV 4:2:0采樣,每四個Y共用一組UV分量。2. 存儲方式
下面我用圖的形式給出常見的YUV碼流的存儲方式,并在存儲方式后面附有取樣每個像素點的YUV數(shù)據(jù)的方法,其中,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數(shù)據(jù)交錯存儲,而是先存放所有的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數(shù)據(jù)提取遵循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數(shù)據(jù), 以720×488大小圖象YUV420 planar為例,
其存儲格式是: 共大小為(720×480×3>>1)字節(jié),
分為三個部分:Y,U和V
Y分量: (720×480)個字節(jié)
U(Cb)分量:(720×480>>2)個字節(jié)
V(Cr)分量:(720×480>>2)個字節(jié)
三個部分內(nèi)部均是行優(yōu)先存儲,三個部分之間是Y,U,V 順序存儲。
即YUV數(shù)據(jù)的0--720×480字節(jié)是Y分量值,
720×480--720×480×5/4字節(jié)是U分量
720×480×5/4 --720×480×3/2字節(jié)是V分量。
4 :2: 2 和4:2:0 轉(zhuǎn)換:
最簡單的方式:
YUV4:2:2 ---> YUV4:2:0 Y不變,將U和V信號值在行(垂直方向)在進行一次隔行抽樣。 YUV4:2:0 ---> YUV4:2:2 Y不變,將U和V信號值的每一行分別拷貝一份形成連續(xù)兩行數(shù)據(jù)。
在YUV420中,一個像素點對應(yīng)一個Y,一個4X4的小方塊對應(yīng)一個U和V。對于所有YUV420圖像,它們的Y值排列是完全相同的,因為只有Y的圖像就是灰度圖像。YUV420sp與YUV420p的數(shù)據(jù)格式它們的UV排列在原理上是完全不同的。420p它是先把U存放完后,再存放V,也就是說UV它們是連續(xù)的。而420sp它是UV、UV這樣交替存放的。(見下圖) 有了上面的理論,我就可以準(zhǔn)確的計算出一個YUV420在內(nèi)存中存放的大小。 width * hight =Y(總和) U = Y / 4 V = Y / 4
所以YUV420 數(shù)據(jù)在內(nèi)存中的長度是 width * hight * 3 / 2,
假設(shè)一個分辨率為8X4的YUV圖像,它們的格式如下圖:
YUV420sp格式如下圖
YUV420p數(shù)據(jù)格式如下圖

旋轉(zhuǎn)90度的算法:
public static void rotateYUV240SP(byte[] src,byte[] des,int width,int height) { int wh = width * height; //旋轉(zhuǎn)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的區(qū)別 一般來說,直接采集到的視頻數(shù)據(jù)是RGB24的格式,RGB24一幀的大小size=width×heigth×3 Bit,RGB32的size=width×heigth×4,如果是I420(即YUV標(biāo)準(zhǔn)格式4:2:0)的數(shù)據(jù)量是 size=width×heigth×1.5 Bit。 在采集到RGB24數(shù)據(jù)后,需要對這個格式的數(shù)據(jù)進行第一次壓縮。即將圖像的顏色空間由RGB2YUV。因為,X264在進行編碼的時候需要標(biāo)準(zhǔn)的YUV(4:2:0)。但是這里需要注意的是,雖然YV12也是(4:2:0),但是YV12和I420的卻是不同的,在存儲空間上面有些區(qū)別。如下: YV12 : 亮度(行×列) + U(行×列/4) + V(行×列/4)
I420 : 亮度(行×列) + V(行×列/4) + U(行×列/4)
可以看出,YV12和I420基本上是一樣的,就是UV的順序不同。
繼續(xù)我們的話題,經(jīng)過第一次數(shù)據(jù)壓縮后RGB24->YUV(I420)。這樣,數(shù)據(jù)量將減少一半,為什么呢?呵呵,這個就太基礎(chǔ)了,我就不多寫了。同樣,如果是RGB24->YUV(YV12),也是減少一半。但是,雖然都是一半,如果是YV12的話效果就有很大損失。然后,經(jīng)過X264編碼后,數(shù)據(jù)量將大大減少。將編碼后的數(shù)據(jù)打包,通過RTP實時傳送。到達(dá)目的地后,將數(shù)據(jù)取出,進行解碼。完成解碼后,數(shù)據(jù)仍然是YUV格式的,所以,還需要一次轉(zhuǎn)換,這樣windows的驅(qū)動才可以處理,就是YUV2RGB24。
YUY2 是 4:2:2 [Y0 U0 Y1 V0]
yuv420p 和 YUV420的區(qū)別 在存儲格式上有區(qū)別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 =>YUV420PYV12: YYYYYYYY VV UU =>YUV420PNV12: YYYYYYYY UVUV =>YUV420SPNV21: YYYYYYYY VUVU =>YUV420SP
http://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html新聞熱點
疑難解答