概念
YUV和RGB的功能類似,都是用來表示影像色彩的。但是對於 YUV 所表示的影像,Y 和 UV 分量是分離的。如果只有 Y 分量而沒有 UV 分離,那麼影像表示的就是黑白影像。彩色電視機採用的就是 YUV 影像,解決與和黑白電視機的相容問題,使黑白電視機也能接受彩色電視訊號。 YUV不像RGB那樣要求三個獨立的視訊訊號同時傳輸,所以用YUV方式傳送佔用極少的頻寬。因此RGB用於渲染,YUV用於傳輸。
因為人眼對色度的敏感程度低於對亮度的敏感程度。主要原因是視網膜杆細胞多於視網膜錐細胞,其中視網膜杆細胞的作用就是識別亮度,視網膜錐細胞的作用就是識別色度。所以,眼睛對於亮度的分辨要比對顏色的分辨精細一些。利用這個原理,可以把色度資訊減少一點,人眼也無法察覺這一點。 這也是視訊壓縮的原理之一。
我們重溫一下這張圖:視訊檔案播放流程圖
視訊通過解碼器解碼出來得到YUV資料,YUV再轉換成RGB交給GPU渲染就能在顯示器上看到畫面了。
YUV的儲存方式
YUV格式有兩大類:planar和packed。
對於planar的YUV格式,先連續儲存所有畫素點的Y,緊接著儲存所有畫素點的U,隨後是所有畫素點的V。
對於packed的YUV格式,每個畫素點的Y,U,V是連續交替儲存的。
YUV的取樣
主流的取樣方式有三種,YUV4:4:4,YUV4:2:2,YUV4:2:0
YUV4:4:4 表示完全取樣,每一個Y對應一組UV分量。 一個YUV佔 8+8+8 = 24bits,3個位元組。
YUV4:2:2 表示2:1的水平取樣,垂直完全取樣,,每兩個Y共用一組UV分量。 一個YUV佔 8+4+4 = 16bits 2個位元組。
YUV4:2:0 表示2:1的水平取樣,垂直2:1取樣,每四個Y共用一組UV分量。 一個YUV佔 8+2+2 = 12bits 1.5個位元組
注意:YUV 4:2:0這並不意味著只有Y、U,沒有V分量,只是說U分量和V分類交替取樣。 一個位元組是8位
直接上圖:
為什麼這張圖是8X4的圖,因為我們假設這是一張寬是8畫素,高是4個畫素的圖,當然你也可以用4X4的。
YUV與RGB轉換
RGB轉成YUV:
Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16 Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128 Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128
YUV轉成RGB: B = 1.164(Y - 16) + 2.018(U - 128) G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128) R = 1.164(Y - 16) + 1.596(V - 128)
YUV420p和YUV420sp具體分類和詳情
YUV420也是目前最主流的取樣方式,因為這樣的取樣最省空間,而又不會大幅度影響人類肉眼的觀賞性。
YUV420p:又叫planer平面模式,Y ,U,V分別在不同平面,也就是有三個平面。
YUV420p又分為YU12 和 YU21(又叫I420):他們的區別只是儲存UV的順序不一樣而已。
YU12:安卓的模式。儲存順序是先存Y,再存U,最後存V。YYYYUUUVVV
YV12:儲存順序是先存Y,再存V,最後存U。YYYVVVUUU
YUV420SP是packed型別的。它是先儲存了 Y 分量,但接下來並不是再儲存所有的 U 或者 V 分量,而是把 UV 分量交替連續儲存。
NV12 和 NV21 格式都屬於YUV420SP型別。
NV12 是 IOS 中有的模式,它的儲存順序是先存 Y 分量,再 UV 進行交替儲存。
NV21 是 安卓 中有的模式,它的儲存順序是先存 Y 分量,在 VU 交替儲存。
YUV的記憶體大小計算
記憶體大小 = 一個YUV的位元組大小 * 寬 * 高 以YUV420為例,總大小=寬高1.5 Y分量 = 寬 * 高 U分量 = 總大小 / 4 V分量 = 總大小 / 4
結語
對於YUV基本的認識今天先了解到這裡,如果你也想深入學習音視訊開發,請掃碼關注共同進步。