目錄(?)[-]
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格式有兩大類(lèi):planar和packed。對(duì)于planar的YUV格式,先連續(xù)存儲(chǔ)所有像素點(diǎn)的Y,緊接著存儲(chǔ)所有像素點(diǎn)的U,隨后是所有像素點(diǎn)的V。對(duì)于packed的YUV格式,每個(gè)像素點(diǎn)的Y,U,V是連續(xù)交*存儲(chǔ)的。
YUV,分為三個(gè)分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用于指定像素的顏色。
與我們熟知的RGB類(lèi)似,YUV也是一種顏色編碼方法,主要用于電視系統(tǒng)以及模擬視頻領(lǐng)域,它將亮度信息(Y)與色彩信息(UV)分離,沒(méi)有UV信息一樣可以顯示完整的圖像,只不過(guò)是黑白的,這樣的設(shè)計(jì)很好地解決了彩色電視機(jī)與黑白電視的兼容問(wèn)題。并且,YUV不像RGB那樣要求三個(gè)獨(dú)立的視頻信號(hào)同時(shí)傳輸,所以用YUV方式傳送占用極少的頻寬。
YUV碼流的存儲(chǔ)格式其實(shí)與其采樣的方式密切相關(guān),主流的采樣方式有三種,YUV4:4:4,YUV4:2:2,YUV4:2:0,關(guān)于其詳細(xì)原理,可以通過(guò)網(wǎng)上其它文章了解,這里我想強(qiáng)調(diào)的是如何根據(jù)其采樣格式來(lái)從碼流中還原每個(gè)像素點(diǎn)的YUV值,因?yàn)橹挥姓_地還原了每個(gè)像素點(diǎn)的YUV值,才能通過(guò)YUV與RGB的轉(zhuǎn)換公式提取出每個(gè)像素點(diǎn)的RGB值,然后顯示出來(lái)。
用三個(gè)圖來(lái)直觀(guān)地表示采集的方式吧,以黑點(diǎn)表示采樣該像素點(diǎn)的Y分量,以空心圓圈表示采用該像素點(diǎn)的UV分量。
先記住下面這段話(huà),以后提取每個(gè)像素的YUV分量會(huì)用到。
YUV 4:4:4采樣,每一個(gè)Y對(duì)應(yīng)一組UV分量。YUV 4:2:2采樣,每?jī)蓚€(gè)Y共用一組UV分量。 YUV 4:2:0采樣,每四個(gè)Y共用一組UV分量。2. 存儲(chǔ)方式
下面我用圖的形式給出常見(jiàn)的YUV碼流的存儲(chǔ)方式,并在存儲(chǔ)方式后面附有取樣每個(gè)像素點(diǎn)的YUV數(shù)據(jù)的方法,其中,Cb、Cr的含義等同于U、V。
(1) YUVY 格式 (屬于YUV422)
YU12和YV12屬于YUV420格式,也是一種Plane模式,將Y、U、V分量分別打包,依次存儲(chǔ)。其每一個(gè)像素點(diǎn)的YUV數(shù)據(jù)提取遵循YUV420格式的提取方式,即4個(gè)Y分量共用一組UV。注意,上圖中,Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次類(lèi)推。
(5)NV12、NV21(屬于YUV420)
NV12和NV21屬于YUV420格式,是一種two-plane模式,即Y和UV分為兩個(gè)Plane,但是UV(CbCr)為交錯(cuò)存儲(chǔ),而不是分為三個(gè)plane。其提取方式與上一種類(lèi)似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00
YUV420 planar數(shù)據(jù), 以720×488大小圖象YUV420 planar為例,
其存儲(chǔ)格式是: 共大小為(720×480×3>>1)字節(jié),
分為三個(gè)部分:Y,U和V
Y分量: (720×480)個(gè)字節(jié)
U(Cb)分量:(720×480>>2)個(gè)字節(jié)
V(Cr)分量:(720×480>>2)個(gè)字節(jié)
三個(gè)部分內(nèi)部均是行優(yōu)先存儲(chǔ),三個(gè)部分之間是Y,U,V 順序存儲(chǔ)。
即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)換:
最簡(jiǎn)單的方式:
YUV4:2:2 ---> YUV4:2:0 Y不變,將U和V信號(hào)值在行(垂直方向)在進(jìn)行一次隔行抽樣。 YUV4:2:0 ---> YUV4:2:2 Y不變,將U和V信號(hào)值的每一行分別拷貝一份形成連續(xù)兩行數(shù)據(jù)。
在YUV420中,一個(gè)像素點(diǎn)對(duì)應(yīng)一個(gè)Y,一個(gè)4X4的小方塊對(duì)應(yīng)一個(gè)U和V。對(duì)于所有YUV420圖像,它們的Y值排列是完全相同的,因?yàn)橹挥衁的圖像就是灰度圖像。YUV420sp與YUV420p的數(shù)據(jù)格式它們的UV排列在原理上是完全不同的。420p它是先把U存放完后,再存放V,也就是說(shuō)UV它們是連續(xù)的。而420sp它是UV、UV這樣交替存放的。(見(jiàn)下圖) 有了上面的理論,我就可以準(zhǔn)確的計(jì)算出一個(gè)YUV420在內(nèi)存中存放的大小。 width * hight =Y(總和) U = Y / 4 V = Y / 4
所以YUV420 數(shù)據(jù)在內(nèi)存中的長(zhǎng)度是 width * hight * 3 / 2,
假設(shè)一個(gè)分辨率為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ū)別 一般來(lái)說(shuō),直接采集到的視頻數(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ù)后,需要對(duì)這個(gè)格式的數(shù)據(jù)進(jìn)行第一次壓縮。即將圖像的顏色空間由RGB2YUV。因?yàn)椋琗264在進(jìn)行編碼的時(shí)候需要標(biāo)準(zhǔn)的YUV(4:2:0)。但是這里需要注意的是,雖然YV12也是(4:2:0),但是YV12和I420的卻是不同的,在存儲(chǔ)空間上面有些區(qū)別。如下: YV12 : 亮度(行×列) + U(行×列/4) + V(行×列/4)
I420 : 亮度(行×列) + V(行×列/4) + U(行×列/4)
可以看出,YV12和I420基本上是一樣的,就是UV的順序不同。
繼續(xù)我們的話(huà)題,經(jīng)過(guò)第一次數(shù)據(jù)壓縮后RGB24->YUV(I420)。這樣,數(shù)據(jù)量將減少一半,為什么呢?呵呵,這個(gè)就太基礎(chǔ)了,我就不多寫(xiě)了。同樣,如果是RGB24->YUV(YV12),也是減少一半。但是,雖然都是一半,如果是YV12的話(huà)效果就有很大損失。然后,經(jīng)過(guò)X264編碼后,數(shù)據(jù)量將大大減少。將編碼后的數(shù)據(jù)打包,通過(guò)RTP實(shí)時(shí)傳送。到達(dá)目的地后,將數(shù)據(jù)取出,進(jìn)行解碼。完成解碼后,數(shù)據(jù)仍然是YUV格式的,所以,還需要一次轉(zhuǎn)換,這樣windows的驅(qū)動(dòng)才可以處理,就是YUV2RGB24。
YUY2 是 4:2:2 [Y0 U0 Y1 V0]
yuv420p 和 YUV420的區(qū)別 在存儲(chǔ)格式上有區(qū)別yuv420p:yyyyyyyy uuuuuuuu vvvvv yuv420: yuv yuv yuv
YUV420P,Y,U,V三個(gè)分量都是平面格式,分為I420和YV12。I420格式和YV12格式的不同處在U平面和V平面的位置不同。在I420格式中,U平面緊跟在Y平面之后,然后才是V平面(即:YUV);但YV12則是相反(即:YVU)。YUV420SP, Y分量平面格式,UV打包格式, 即NV12。 NV12與NV21類(lèi)似,U 和 V 交錯(cuò)排列,不同在于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新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注