前言
照例是先廢話幾句,下面的內容都是在學習時從網上找來的,並非我原創,我之所以要寫這篇筆記是因為網的內容都很分散,找的時候要從各個地方看,很不方便,所以就自己總結了一篇,同樣的,如果你搜到了這篇文章且有地方沒看懂,請評論讓我知道,謝謝!如果看懂了且對你有幫助可以點個贊:)
認識YUV
以下我的理解,因為學習時間不久,可能不一定准確:
YUV與RGB一樣,都是像素數據的編碼格式,一組YUV渲染屏幕上的一個像素,控制屏幕用色彩的形式將事物表現出來,其中Y表示像素中的亮度,英文是Luminance,U表示色度,英文是Chrominance,V表示濃度或飽和度,英文是Chroma。這是一種壓縮后的顏色表示方法,占用更少的物理空間,且對顏色的表現失真不明顯,所以現在非常常用,我見過的很多視頻在播放時都是使用這種形式展現的。
YUV的宏觀存儲方式
在宏觀上,YUV有兩種存儲方式:planar、packed。
planar:從字面意思上來看,planar是平面的意思,平面比較平整,對應到存儲方式上就是把YUV三種分量分別存儲,以I420為例,存儲方式為:YYYYYYYYUUVV,簡單明了,先把Y存完,再存U,再存V,這種在解析時很方便
packed:從字面意思來看,packed是打包的意思,打包就不一定是平整的了,對應到存儲方式上就是把YUV三種分量交叉存儲,以YUY2為例,存儲方式為:Y0U0Y1V0 Y2U1Y3V1,這種方式在解析時就會比較麻煩
上面只是舉了兩個覺的例子,事實上還有很多其它的格式,后面一一細講。
采樣方式
采樣方式即如何表現一個像素,現在主流的有三種采樣方式,4:4:4、4:2:2、4:2:0,這三種比例是YUV三種分量的比例,咱們前面說過像素是用YUV三個分量控制顯示的,所以一個像素應該包含一個Y,一個U,一個V,如果要完全存儲,那一個一個像素點就要存儲YUV三個分量,這種形式就是4:4:4了。但是因為人的眼睛對色度和飽和度不是特別敏感,所以一定程度上丟失一部分UV並不影響我們分辨顏色,所以聰明的先驅們為了節省存儲空間,在存儲時就故意丟掉部分UV分量,用兩個Y分量共用一組UV分量,這種形式就是4:2:2,或用四個Y分量共用一組UV,這種形式就是4:2:0了。用網上找的圖表示比較形象。
下圖中以黑點表示采樣該像素點的Y分量,以空心圓圈表示采用該像素點的UV分量
在存儲時YUV各占一個字節Byte,如果4:4:4方式,那一個256X256分辨率的圖片要占用256×256×3=196608Byte,4:2:2方式要占用256×256×2=131072Byte,4:2:0方式要占用256×256×2/3=43690.7Byte,可以看到采用4:2:0方式存儲空間整整減少了一半。
常見存儲格式
YU12/I420
該格式屬於4:2:0類型,存儲方式上面已經說過,就是先存儲把全部的Y分量存完,再存U分量,最后存V分量,從網上找了一張很形象的圖:
可以看到,第一行的Y1Y2和第二行的Y7Y8共同使用一組UV分量U1V1。
YV12
該格式與YU12基本一樣,唯一的區別是先存儲V分量再存儲U分量,對應到上圖把第五行和第六行位置互換一下就是了。
以上兩種格式我們可以看到都是4:2:0的,因為都是planar方式存儲,簡稱420p。
除了上面兩種,還有兩種4:2:0,NV12和NV21,這兩種是比較特殊的存儲格式,是planar和packed混合存儲的,分別看下
NV12
該格式是先存儲全部的Y分量,然后UV分量交叉存儲,用圖像表示下:
很直觀,不多說了。
NV21
該格式與NV21的區別和上面YU12/YV12一樣,唯一的區別只是UV分量交叉的順序不同,NV12是U排前面,NV21是V排前面,用圖像表示如下:
上面兩種雖然也是4:2:0類型,但是並不是完全的planar格式,所以又稱為420sp,與420p進行區分。
上面說的都是4:2:0類型的,下面說幾個4:2:2類型較常見的
YUV422P
名字中帶P表示是planar格式存儲,該格式存儲方式與I420是一樣的,唯一的區別是UV分量的數量不同,I420中四個Y共用一組UV,而該格式中兩個Y共用一組UV,也就是說UV分量相對於I420在數量上多了一倍,從網上找了一張圖,如下:
如上圖,在渲染時Y00與Y01會共用U00和V00.
YUYV/YUY2
該格式屬於4:2:2類型,且是用packed形式存儲的,上面也簡單的說過,存儲方式如下圖:
可以看到,每兩個Y分量共用一組UV分量,存儲順序是YUYV。
YVYU
該格式與YUYV相似,只是存儲時UV分量順序不同而已,為YVYU。
UYVY
該格式也是4:2:2類型,與上面兩種方式並無大的不同,從網上找了一張圖如下:
可以看到存儲時YUV分量的順序如名字所示:UYVY。
結語
上面是比較常見的存儲格式,除了這些還有其它的,但是我個人查找資料看來,用的並不多,所以就沒記錄。