導(dǎo)語
今天跟大家分享的這篇文章,也是之前自己總結(jié)的,大致就是想說明一下,視頻的裸數(shù)據(jù)yuv格式的各種分類。
剛開始接觸yuv的時(shí)候,筆者就被形形色色的各種各樣的yuv格式弄得一頭霧水。因此也決心好好梳理一下這部分知識(shí)。當(dāng)時(shí)感覺對(duì)各個(gè)格式已經(jīng)比較清楚了。正好現(xiàn)在又要有相關(guān)的開發(fā),因此決定復(fù)習(xí)復(fù)習(xí)。
希望這篇總結(jié)能對(duì)大家有所幫助
內(nèi)容
? 對(duì)格式采樣的理解
提出yuv格式的原因,是為了解決彩色電視和黑白電視兼容性問題,因此從rgb的顏色空間,轉(zhuǎn)換為yuv的顏色空間,其中y代表亮度,u和v代表色度。
yuv種類分為很多,可以理解是一個(gè)二維的,即空間間,和空間內(nèi),這樣的表述,借鑒了h264中的幀間和幀內(nèi)的思想
為什么這么說呢?
下面分別從這兩種情況闡述一下這個(gè)觀點(diǎn):
空間-間:不同空間,即描述一個(gè)像素的bit數(shù)不同,比如yuv444,yuv422,yuv411,yuv420
空間-內(nèi):相同空間,即描述一個(gè)像素的bit數(shù)相同,但是存儲(chǔ)方式不同,比如對(duì)于yuv420而言,又可細(xì)分為yuv420p,yuv420sp,nv21,nv12,yv12,yu12,I420
因此,我們?cè)诶斫鈟uv格式時(shí),時(shí)刻需要記住要從bit數(shù),和存儲(chǔ)結(jié)構(gòu)兩方面考察
? 對(duì)于4的理解
為什么yuv444,yuv420,yuv422,yuv411都是用的4呢?
我仔細(xì)的研究了一下,
首先yuv的命名方式和rgb的命名方式是不相同的,如果是rgb4444,這里的數(shù)字代表的是不同顏色分量所占的bit數(shù)
這里,rgb4444代表alpha 4bit,red 4bit,green 4bit,blue 4bit,從宏觀上看,是16bit,也就是2字節(jié),但是從微觀上看,是以bit區(qū)分的
yuv的命名方式則不是這種情況,yuv不會(huì)分細(xì)到bit級(jí)別,最低最低的單位,也是1字節(jié),即8bit,說到這里,就會(huì)拋出一個(gè)問題,
難道每個(gè)像素點(diǎn)都需要至少1字節(jié)的整數(shù)倍來描述嗎?
如果說描述的最小單位是1字節(jié),那么每個(gè)像素都是由y,u,v共同描述的,難道說明每個(gè)像素點(diǎn)至少都是
1字節(jié)y+1字節(jié)u+1字節(jié)v = 3字節(jié)
來描述嗎?顯然這是不合理的,因?yàn)槿搜蹖?duì)y是很敏感的,但是u和v是可以在一定程度上壓縮的,也就是說,同一個(gè)像素點(diǎn),u和v的描述可以小于1字節(jié),那么這是不是和最小單位為一字節(jié)矛盾呢?答案是不矛盾,因?yàn)橛玫搅斯蚕淼乃枷?,這是yuv和rgb的本質(zhì)區(qū)別
rgb是一個(gè)像素是一個(gè)家庭,家庭成員是r,g,b,但是yuv是若干像素是一個(gè)家庭,不同像素的y共享同一個(gè)u和v,這樣,引入了共享的思想,雖然最小單位是一個(gè)字節(jié),但實(shí)際上描述一個(gè)像素點(diǎn)的字節(jié),不一定是字節(jié)的整數(shù)倍
該進(jìn)入正題了,為什么是4?因?yàn)檫@個(gè)4,實(shí)際上表達(dá)了共享的最大單位!也就是最多4個(gè)像素進(jìn)行共享,因此4實(shí)際上是隱含的采樣全集
? 不同空間下yuv格式
這里從空間的角度考慮yuv格式
① yuv444
那么yuv444代表什么呢?就是最完整的最理想的最奢侈的狀態(tài),
[ y u v ] [ y u v ] [ y u v ] [ y u v ]
[ y u v ] [ y u v ] [ y u v ] [ y u v ]
[ y u v ] [ y u v ] [ y u v ] [ y u v ]
[ y u v ] [ y u v ] [ y u v ] [ y u v ]
這無疑是最理想的狀態(tài)了y,u,v都為4,說明大家都是滿的
② yuv422
那么,yuv422呢?說明這里,u由4變?yōu)?,v由4變?yōu)?,也就是在原來滿的情況下,每行需要去掉兩個(gè)u和兩個(gè)v
如何去掉呢?最簡(jiǎn)單的方法就是第一個(gè)點(diǎn)保留u,第二個(gè)點(diǎn)保留v,第三個(gè)點(diǎn)保留u,第四個(gè)點(diǎn)保留v ..
圖示如下:
[ y u ] [ y v ] [ y u ] [ y v ]
[ y v ] [ y u ] [ y v ] [ y u ]
[ y u ] [ y v ] [ y u ] [ y v ]
[ y v ] [ y u ] [ y v ] [ y u ]
在這張圖中,顯然一個(gè)家庭的成員為
[ y u ] [ y v ]
也就是兩個(gè)像素點(diǎn)共享uv
③ yuv411
yuv411又是什么情況呢?顯然在原來yuv422的基礎(chǔ)上,每行再去掉一個(gè)u和一個(gè)v
圖示如下:
[ y u ] [ y ] [ y v ] [ y ]
[ y u ] [ y ] [ y v ] [ y ]
[ y u ] [ y ] [ y v ] [ y ]
[ y u ] [ y ] [ y v ] [ y ]
這個(gè)家庭的成員為
[ y u ] [ y ] [ y v ] [ y ]
也就是四個(gè)像素點(diǎn)共享uv
④ yuv420
yuv420的意思似乎是在yuv422的基礎(chǔ)上,再拿掉兩個(gè)v,這樣不就沒有v了嗎?
其實(shí)yuv420的取名方式不是很高明,更確切的命名為yuv420yuv402
也就是第一行只有兩個(gè)u,而第二行只有兩個(gè)v
圖示如下:
[ y u ] [ y ] [ y u ] [ y ]
[ y v ] [ y ] [ y v ] [ y ]
[ y u ] [ y ] [ y u ] [ y ]
[ y v ] [ y ] [ y v ] [ y ]
仔細(xì)體會(huì)yuv420和yuv411的區(qū)別
對(duì)于yuv420而言,這個(gè)家庭的成員為
[ y u ] [ y ]
[ y v ] [ y ]
也是四個(gè)像素點(diǎn)共享uv,但是這個(gè)家庭顯然比yuv411的家庭關(guān)系更近一些
思考:從這個(gè)課題討論來看,我們是否可以進(jìn)一步提高yuv的壓縮效率?可以更多y共享uv嗎?可以自適應(yīng)嗎?
小結(jié):從這里可以看出,yuv211和yuv422顯然格式上是不一樣的,因此這里的數(shù)字不僅僅代表了比例,還代表了實(shí)際的值
? 三種格式packet,planar,semi-plane
在這一課題,我們探討一下相同bit數(shù)的不同存儲(chǔ)格式,主要討論yuv422和yuv420
packet是打包格式,即存儲(chǔ)yuv,然后再存儲(chǔ)下一個(gè)yuv ..
planar是平面格式,即先存儲(chǔ)y平面,再存儲(chǔ)u平面,最后存儲(chǔ)v平面
semi-planar是兩個(gè)平面,正常的planar是三個(gè)平面,即y平面,u平面,v平面,現(xiàn)在的semi-planar是兩個(gè)平面,也就是說uv為同一個(gè)平面,即一個(gè)y平面,一個(gè)uv平面
① yuv422
yuyv(yuy2)
[ y u ] [ y v ] [ y u ] [ y v ]
[ y u ] [ y v ] [ y u ] [ y v ]
[ y u ] [ y v ] [ y u ] [ y v ]
[ y u ] [ y v ] [ y u ] [ y v ]
uyvy
[ u y ] [ v y ] [ u y ] [ v y ]
[ u y ] [ v y ] [ u y ] [ v y ]
[ u y ] [ v y ] [ u y ] [ v y ]
[ u y ] [ v y ] [ u y ] [ v y ]
yuv422p(yu16)
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ u u u u ]
[ u u u u ]
[ v v v v ]
[ v v v v ]
或(yv16)
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ v v v v ]
[ v v v v ]
[ u u u u ]
[ u u u u ]
yuv422sp(nv16)
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ u v u v ]
[ u v u v ]
[ u v u v ]
[ u v u v ]
或(nv61)
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ v u v u ]
[ v u v u ]
[ v u v u ]
[ v u v u ]
② yuv420
yuv420p(yu12 / I420)
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ u u ]
[ u u ]
[ v v ]
[ v v ]
或(yv12)
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ v v ]
[ v v ]
[ u u ]
[ u u ]
yuv420sp(nv12)
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ u v u v ]
[ u v u v ]
或(nv21)
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ y y y y ]
[ v u v u ]
[ v u v u ]
? 對(duì)nv系列理解
常見的有nv12,nv21,nv16,nv61等,這里代表什么意思呢?
其實(shí)nv系列,都屬于semi-plane系列
這里nv12表示正常的順序,即uv plane,先是u,然后是v
而nv21表示相反的順序,即uv plane,先是v,然后是u
同樣,nv16和nv61的區(qū)別也是僅僅是uv的次序而已
這里的12和16又代表什么呢?實(shí)際上代表的是一個(gè)像素所占的位數(shù)!
以nv12為例,表示一個(gè)像素占用12bit,其中y是定死的占8bit,也就是u占2bit,v占2bit,實(shí)際上就是yuv420格式,具體而言是yuv420sp格式
nv16,則表示一個(gè)像素占用16bit,其中y是定死的8bit,也即是u占4bit,v占4bit,實(shí)際上就是yuv422格式,具體而言是yuv422sp格式