一:介紹
YUV是被歐洲電視系統(tǒng)所采用的一種顏色編碼方法(屬于PAL)宣虾,是PAL和SECAM模擬彩色電視制式采用的顏色空間。在現(xiàn)代彩色電視系統(tǒng)中,通常采用三管彩色攝影機或彩色CCD攝影機進行取像,然后把取得的彩色圖像信號經(jīng)分色、分別放大校正后得到RGB矗晃,再經(jīng)過矩陣變換電路得到亮度信號Y和兩個色差信號B-Y(即U)、R-Y(即V)宴倍,最后發(fā)送端將亮度和色差三個信號分別進行編碼张症,用同一信道發(fā)送出去。這種色彩的表示方法就是所謂的YUV色彩空間表示鸵贬。采用YUV色彩空間的重要性是它的亮度信號Y和色度信號U俗他、V是分離的。
二:含義
Y:亮度信號
UV:兩個色差信號B-Y(即U阔逼,藍色差信號)兆衅、R-Y(即V,紅色差信號)
色差信號:用基色信號減去亮度信號就得到色差信號。例如藍色差信號(B-Y)羡亩、紅色差(R-Y)兩個色差信號和一個亮度信號(Y)摩疑。 嚴格上講,色差信號共有三個畏铆,即R-Y雷袋,B-Y,G-Y辞居。但只有兩個是獨立的楷怒,第三個可用另外兩個求出。
三:優(yōu)點作用
YUV主要用于優(yōu)化彩色視頻信號的傳輸瓦灶,使其向后相容老式黑白電視鸠删。與RGB視頻信號傳輸相比,它最大的優(yōu)點在于只需占用極少的頻寬(RGB要求三個獨立的視頻信號同時傳輸)倚搬。其中“Y”表示明亮度(Luminance或Luma)冶共,也就是灰階值;而“U”和“V” 表示的則是色度(Chrominance或Chroma)每界,作用是描述影像色彩及飽和度,用于指定像素的顏色家卖≌2悖“亮度”是透過RGB輸入信號來建立的,方法是將RGB信號的特定部分疊加到一起上荡∨坑#“色度”則定義了顏色的兩個方面─色調(diào)與飽和度,分別用Cr和Cb來表示酪捡。其中叁征,Cr反映了RGB輸入信號紅色部分與RGB信號亮度值之間的差異。而Cb反映的是RGB輸入信號藍色部分與RGB信號亮度值之間的差異逛薇。
采用YUV色彩空間的重要性是它的亮度信號Y和色度信號U捺疼、V是分離的。如果只有Y信號分量而沒有U永罚、V分量啤呼,那么這樣表示的圖像就是黑白灰度圖像。彩色電視采用YUV空間正是為了用亮度信號Y解決彩色電視機與黑白電視機的兼容問題呢袱,使黑白電視機也能接收彩色電視信號官扣。
對于數(shù)字視頻,定義了從 RGB 到兩個主要 YUV 的轉(zhuǎn)換羞福。這兩個轉(zhuǎn)換都基于稱為 ITU-R Recommendation BT.709 的規(guī)范惕蹄。第一個轉(zhuǎn)換是 BT.709 中定義用于 50-Hz 的較早的 YUV 格式。它與在 ITU-R Recommendation BT.601 中指定的關(guān)系相同, ITU-R Recommendation BT.601 也被稱為它的舊名稱 CCIR 601卖陵。這種格式應(yīng)該被視為用于標準定義 TV分辨率(720 x 576) 和更低分辨率視頻的首選 YUV 格式恋昼。它的特征由下面兩個常量 Kr 和 Kb 的值來定義:
Kr = 0.299
Kb = 0.114
第二個轉(zhuǎn)換為 BT.709 中定義用于 60-Hz 的較新 YUV 格式,應(yīng)該被視為用于高于 SDTV 的視頻分辨率的首選格式赶促。它的特征由下面兩個不同的常量值來定義:
Kr = 0.2126
Kb = 0.0722
從 RGB 到 YUV 轉(zhuǎn)換的定義以下列內(nèi)容開始:L = Kr * R + Kb * B + (1 – Kr – Kb) * G然后液肌,按照下列方式獲得 YUV 值:
Y = floor(2^(M-8) * (219*(L–Z)/S + 16) + 0.5)
U = clip3(0, 2^M-1, floor(2^(M-8) * (112*(B-L) / ((1-Kb)*S) + 128) + 0.5))
V = clip3(0, 2^M-1, floor(2^(M-8) * (112*(R-L) / ((1-Kr)*S) + 128) + 0.5))
其中M 為每個 YUV 樣例的位數(shù) (M >= 8)。
Z 為黑電平變量鸥滨。對于計算機RGB嗦哆,Z 等于 0。對于 studio視頻RGB婿滓,Z 等于 16*2老速,其中 N 為每個 RGB
合并圖冊(1張)
樣例的位數(shù) (N >= 8)。S 為縮放變量凸主。對于計算機RGB橘券,S 等于 255。對于 studio視頻RGB卿吐,S 等于 219*2旁舰。
函數(shù)floor(x) 返回大于或等于 x 的最大整數(shù)。函數(shù)clip3(x, y, z) 的定義如下所示:
clip3(x, y, z) = ((z < x) ? x : ((z > y) ? y : z))Y 樣例表示亮度嗡官,U 和 V 樣例分別表示偏向藍色和紅色的顏色偏差箭窜。Y 的標稱范圍為 16*2 到 235*2 。黑色表示為 16*2 衍腥,白色表示為 235*2 磺樱。U 和 V 的標稱范圍為 16*2 到 240*2 ,值 128*2 表示中性色度婆咸。但是竹捉,實際的值可能不在這些范圍之內(nèi)。
對于 studio 視頻 RGB 形式的輸入數(shù)據(jù)尚骄,要使得 U 和 V 值保持在 0 到 2M-1 范圍之內(nèi)块差,必需進行剪輯操作。如果輸入為計算機RGB乖仇,則不需要剪輯操作憾儒,這是因為轉(zhuǎn)換公式不會生成超出此范圍的值。
這些都是精確的公式乃沙,沒有近似值起趾。
在DirectShow中,常見的RGB格式有RGB1警儒、RGB4训裆、RGB8眶根、RGB565、RGB555边琉、RGB24属百、RGB32、ARGB32等变姨;常見的YUV格式有YUY2族扰、YUYV、YVYU定欧、UYVY渔呵、AYUV、Y41P砍鸠、Y411扩氢、Y211、IF09爷辱、IYUV录豺、YV12、YVU9饭弓、YUV411双饥、YUV420等。
四:采樣格式
主要的采樣格式有YCbCr 4:2:0示启、YCbCr 4:2:2兢哭、YCbCr 4:1:1和 YCbCr 4:4:4。其中YCbCr 4:1:1 比較常用夫嗓,其含義為:每個點保存一個 8bit 的亮度值(也就是Y值),每 2x2 個點保存一個 Cr 和Cb 值,圖像在肉眼中的感覺不會起太大的變化冲秽。所以舍咖, 原來用 RGB(R,G锉桑,B 都是 8bit unsigned) 模型排霉, 1個點需要 8x3=24 bits(如下圖第一個圖),(全采樣后民轴,YUV仍各占8bit)攻柠。按4:1:1采樣后,而現(xiàn)在平均僅需要 8+(8/4)+(8/4)=12bits(4個點后裸,8*4(Y)+8(U)+8(V)=48bits), 平均每個點占12bits(如下圖第二個圖)瑰钮。這樣就把圖像的數(shù)據(jù)壓縮了一半。
上邊僅給出了理論上的示例微驶,在實際數(shù)據(jù)存儲中是有可能是不同的浪谴,下面給出幾種具體的存儲形式:
(1) YUV 4:4:4
YUV三個信道的抽樣率相同开睡,因此在生成的圖像里,每個象素的三個分量信息完整(每個分量通常8比特)苟耻,經(jīng)過8比特量化之后篇恒,未經(jīng)壓縮的每個像素占用3個字節(jié)。
下面的四個像素為: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的碼流為: Y0 U0 V0 Y1 U1 V1 Y2 U2 V2 Y3 U3 V3
(2) YUV 4:2:2
每個色差信道的抽樣率是亮度信道的一半凶杖,所以水平方向的色度抽樣率只是4:4:4的一半胁艰。對非壓縮的8比特量化的圖像來說,每個由兩個水平方向相鄰的像素組成的宏像素需要占用4字節(jié)內(nèi)存智蝠。
下面的四個像素為:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的碼流為:Y0 U0 Y1 V1 Y2 U2 Y3 V3
映射出像素點為:[Y0 U0 V1] [Y1 U0 V1] [Y2 U2 V3] [Y3 U2 V3]
(3) YUV 4:1:1
4:1:1的色度抽樣腾么,是在水平方向上對色度進行4:1抽樣。對于低端用戶和消費類產(chǎn)品這仍然是可以接受的寻咒。對非壓縮的8比特量化的視頻來說哮翘,每個由4個水平方向相鄰的像素組成的宏像素需要占用6字節(jié)內(nèi)存。
下面的四個像素為: [Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
存放的碼流為: Y0 U0 Y1 Y2 V2 Y3
映射出像素點為:[Y0 U0 V2] [Y1 U0 V2] [Y2 U0 V2] [Y3 U0 V2]
(4)YUV4:2:0
4:2:0并不意味著只有Y毛秘,Cb而沒有Cr分量饭寺。它指得是對每行掃描線來說,只有一種色度分量以2:1的抽樣率存儲叫挟。相鄰的掃描行存儲不同的色度分量艰匙,也就是說,如果一行是4:2:0的話抹恳,下一行就是4:0:2员凝,再下一行是4:2:0...以此類推。對每個色度分量來說奋献,水平方向和豎直方向的抽樣率都是2:1健霹,所以可以說色度的抽樣率是4:1。對非壓縮的8比特量化的視頻來說瓶蚂,每個由2x2個2行2列相鄰的像素組成的宏像素需要占用6字節(jié)內(nèi)存糖埋。
下面八個像素為:[Y0 U0 V0] [Y1 U1 V1] [Y2 U2 V2] [Y3 U3 V3]
[Y5 U5 V5] [Y6 U6 V6] [Y7U7 V7] [Y8 U8 V8]
存放的碼流為:Y0 U0 Y1 Y2 U2 Y3
Y5 V5 Y6 Y7 V7 Y8
映射出的像素點為:[Y0 U0 V5] [Y1 U0 V5] [Y2 U2 V7] [Y3 U2 V7]
[Y5 U0 V5] [Y6 U0 V5] [Y7U2 V7] [Y8 U2 V7]
五:YV12和I420的區(qū)別
? ? ? ?一般來說,直接采集到的視頻數(shù)據(jù)是RGB24的格式窃这,RGB24一幀的大小size=width×heigth×3 Bit瞳别,RGB32的size=width×heigth×4,如果是I420(即YUV標準格式4:2:0)的數(shù)據(jù)量是 size=width×heigth×1.5 Bit杭攻。
? ? ? 在采集到RGB24數(shù)據(jù)后祟敛,需要對這個格式的數(shù)據(jù)進行第一次壓縮。即將圖像的顏色空間由RGB2YUV兆解。因為馆铁,X264在進行編碼的時候需要標準的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實時傳送玖瘸。到達目的地后秸讹,將數(shù)據(jù)取出,進行解碼雅倒。完成解碼后嗦枢,數(shù)據(jù)仍然是YUV格式的,所以屯断,還需要一次轉(zhuǎn)換,這樣windows的驅(qū)動才可以處理侣诺,就是YUV2RGB2
六:yuv420p與yuv420sp差別
什么是yuv格式:顧名思義就是有大量的y殖演,u,v三個分量組成的視頻格式
y分量表示視頻的亮度年鸳,uv分量表示色度
yuv420 一幀數(shù)據(jù)表示y:u:v = 4:1:1
比如一段4x4分辨率的頭像
其yuv420sp及nv21的數(shù)據(jù)原型是:
y1? y2? ? y3? ? y4
y5? y6? ? y7? ? y8
y9? y10? y11? y12
y13 y14? y15? y16
v1? u1? ? v2? ? u2
v3? u3? ? v4? ? u4
及y有4x4 = 16個字節(jié)長度
v在y數(shù)據(jù)完后緊跟著y數(shù)據(jù)趴久,與u數(shù)據(jù)交替出現(xiàn)。
v搔确、u長度都為 16/4 = 4彼棍。
將此數(shù)據(jù)轉(zhuǎn)換成yuv420p即可保存為.yuv文件灭忠,并播放出來
yuv420p與yuv420sp格式差別:
yuv420p原始編碼數(shù)據(jù)格式:
y1? y2? ? y3? ? y4
y5? y6? ? y7? ? y8
y9? y10? y11? y12
y13 y14? y15? y16
u1? u2
u3? u4
v1? v2
v3? ? v4
與yuv420sp相比,其y分量是相同的座硕,uv位置不一樣弛作,如果將yuv420sp轉(zhuǎn)換成yuv420p
其轉(zhuǎn)換方法:
publicstaticvoidNv21ToI420(byte[] data,byte[] dstData, intw, inth){intsize = w * h;// YSystem.arraycopy(data,0,dstData,0,size);for(inti =0;i < size /4;i++) {dstData[size + i] = data[size + i *2+1];//UdstData[size + size /4+ i] = data[size + i *2];//V}}
7:基于yuv420p與yuv420sp
YUV420P:
YU12:YYYYYYYY? UUVV
Yv12:YYYYYYYY? VVUU
YUV420SP:
NV12:YYYYYYYY? UVUV
NV21:YYYYYYYY? VUVU