開發(fā)中用途
在比如做移動(dòng)客戶端開發(fā)中(iOS,安卓),我們?cè)谥辈ブ幸獙⒈镜匾曨l推流到服務(wù)器好啰,如何將本地相機(jī)采集的數(shù)據(jù)表示出來轩娶,或者比如我們要對(duì)采集到視頻做旋轉(zhuǎn),裁剪框往,美顏等操作鳄抒,如何能高效的完成以上動(dòng)作,我們都不得不好好了解清楚圖像的結(jié)構(gòu)椰弊,以至于我們能用代碼的形式將它表示出來许溅。
What is YUV ?
YUV是一種顏色編碼方式,主要用于電視系統(tǒng)以及模擬視頻領(lǐng)域秉版,它將亮度信息(Y)與色彩信息(UV)分離贤重,沒有UV信息一樣可以顯示完整的圖像,只不過是黑白的,這樣的設(shè)計(jì)很好地解決了彩色電視機(jī)與黑白電視兼容的問題。
YUV不像傳統(tǒng)RGB那樣要求三個(gè)獨(dú)立的視頻信號(hào)同時(shí)傳輸雀彼,因此YUV方式傳輸視頻占用較少帶寬逗载。
概念區(qū)分
-
Y'UV, YUV, YCbCr, YPbPr, etc.
這幾個(gè)詞乍一看十分相似.
在過去,YUV 和 Y'UV被用作電視系統(tǒng)中顏色信息的特定模擬信息編碼。而YCbCr被用作顏色信息的數(shù)字編碼,通常適用于視頻和靜態(tài)圖像的壓縮和傳輸(MPEG, JPEG)。
今天铐刘,YUV通常用被用在計(jì)算機(jī)行業(yè)描述使用YCbCr編碼的文件格式。
Y:表示明亮度(Luminance,Luma),也就是灰度值
U和V:色度(Chrominance,Chroma),描述影像色彩及飽和度影晓。
1. 采集方式(實(shí)心圓圈代表Y,空心圓圈代表UV)
- YUV4:4:4 (每一個(gè)Y對(duì)應(yīng)一組UV分量)
- YUV4:2:2 (每兩個(gè)Y共用一組UV分量)
- YUV4:2:0 (每四個(gè)Y共用一組UV分量)
2.存儲(chǔ)方式
了解了以上三幅圖的YUV采集方式后镰吵,我們來重點(diǎn)說一下YUV的數(shù)據(jù)是如何存儲(chǔ)的檩禾。
在以上三張圖中,實(shí)心圓圈代表一個(gè)Y分量疤祭,空心圓圈代表一個(gè)UV分量盼产,而因?yàn)橛址秩N不同的采集方式,即1個(gè)Y對(duì)應(yīng)一組UV分量勺馆,2個(gè)Y共用一組UV分量戏售,4個(gè)Y共用一組UV分量,
以YUV4:2:0為例草穆,它又被分為YUV420P與YUV420SP,它們都是YUV420格式灌灾。
- YUV420P, Plane模式(Y,U,V三個(gè)plane)將Y,U,V分量分別打包,依次存儲(chǔ)悲柱。下圖為I420.
- I420 : YYYYYYYY UU VV
- YV12 : YYYYYYYY VV UU
- YUV420SP(NV12/NV21): two-plane模式锋喜,即Y和UV分為兩個(gè)Plane,但是UV(CbCr)為交錯(cuò)存儲(chǔ),而不是分為三個(gè)plane. 下圖為NV12
- NV12: YYYYYYYY UVUV
- NV21: YYYYYYYY VUVU
根據(jù)以上兩幅圖豌鸡,我們以分辨率為640*480的圖片為例嘿般,則它的大小為 Y : width(640) * height(480) 可認(rèn)為每個(gè)Y即為每個(gè)像素點(diǎn),又因?yàn)槊?個(gè)Y共用一組UV,所以涯冠,U和V的大小都為: width(640) * height(480) * (1 / 4 ). 所以圖片真正的大小為 Y+U+V = 3 / 2 * (width(640) * height(480)).
知道了YUV像素的排列方式以及如何求圖像真正大小后我們便可以開始我們真正的工作炉奴。
在程序中,比如一張圖片的分辨率為640*480,如果該圖片的格式為YUV420P,則我們可以很輕松的算出這張圖片的Y,U,V三個(gè)分量蛇更。
我們用數(shù)組來存儲(chǔ)該圖像的大小byte[] src
則(I420)
Y = src[width * height];
U = Y + scr[1/4 * width * height];
V = U + scr[1/4 * width * height];
注意瞻赶,計(jì)算的結(jié)果是通過不同格式來求的,所以不再一一介紹械荷。
YUV格式可分為兩大類:打包(packed) , 平面(planar)
- 打包(packed) : 將YUV分量存放在同一個(gè)數(shù)組中共耍,通常是幾個(gè)相鄰的像素組成的一個(gè)宏像素(macro-pixel);
- 平面(planar) : 使用三個(gè)數(shù)組分開存放YUV三個(gè)分量虑灰,就像一個(gè)三維平面吨瞎。
在以后的開發(fā)中,假如我們要對(duì)視頻流中的圖片做一些特殊處理穆咐,比如Crop, Rotate, Scale, 美顏等等颤诀,如果想高效實(shí)現(xiàn)我們必須了解YUV的格式這樣我們才能做出正確處理。
總結(jié)
本文為YUV的基礎(chǔ)知識(shí)对湃,幫助初學(xué)者或在工作中接觸音視頻開發(fā)后因概念難以理解造成困惑無法繼續(xù)開發(fā)的開發(fā)人員崖叫,只有我們了解了YUV的組成才能在代碼中進(jìn)行靈活應(yīng)用,包括使用例如libyuv等優(yōu)秀的第三方庫拍柒。