YUV數(shù)據(jù)格式
目錄
YUV的原理
YUV的取值范圍
YUV的存儲(chǔ)格式
YUV的采樣格式
存儲(chǔ)方式
10bit YUV數(shù)據(jù)的存儲(chǔ)
參考
[2]?fourcc.org/yuv
[3]?fourcc.org/rgb
[4]?雷霄驊/最簡(jiǎn)單的基于FFmpeg的libswscale的示例(YUV轉(zhuǎn)RGB)
[5]?zhanghui_cuc/10bit YUV數(shù)據(jù)在內(nèi)存中的存儲(chǔ)格式
[6]?docs.microsoft.com/10-bit and 16-bit YUV Video Formats
1. YUV的原理
YUV 的原理是把亮度(Luma)與色度(Chroma)分離蔚舀。
“Y”表示亮度抖仅,也就是灰度值笨使。
“U”表示藍(lán)色通道與亮度的差值嗜憔。
“V”表示紅色通道與亮度的差值悄泥。
其中 Y 信號(hào)分量除了表示亮度信號(hào)外呜象,還含有較多的綠色通道量呼寸,單純的 Y 分量可以顯示出完整的黑白圖像稳捆。
U火的、V 分量分別表示藍(lán) (blue)壶愤、紅 (red) 分量信號(hào),只含有色度信息馏鹤,所以 YUV 也稱(chēng)為 YCbCr征椒,其中,Cb湃累、Cr的含義等同于U勃救、V碍讨,C 可以理解為 component 或者 color。
RGB 轉(zhuǎn) YUV 的公式能更好地反應(yīng) YUV 與 RGB 的關(guān)系剪芥,以及為什么稱(chēng)為 YCbCr:
yuv1.png
RGB與YUV的變換公式如下:
yuv_rgb.jpg
在RGB色彩空間中垄开,三個(gè)顏色的重要程度相同,所以需要使用相同的分辨率進(jìn)行存儲(chǔ)税肪,最多使用RGB565這樣的形式減少量化的精度溉躲,但數(shù)據(jù)量還是很大的。
研究發(fā)現(xiàn)人眼對(duì)亮度的敏感超過(guò)色度益兄。將圖像的亮度信息和顏色信息分離锻梳,并使用不同的分辨率進(jìn)行存儲(chǔ),這樣在對(duì)主觀感覺(jué)影響很小的前提下净捅,可以更加有效地存儲(chǔ)圖像數(shù)據(jù)疑枯。
2. YUV的取值范圍
與RGB每個(gè)像素點(diǎn)的每個(gè)分量取值范圍為0-255不同(每個(gè)分量占8bit),YUV取值范圍有兩種:
以Rec.601為代表(還包括BT.709 / BT.2020)的廣播電視標(biāo)準(zhǔn)中蛔六,Y的取值范圍是16-235荆永,U、V的取值范圍是16-240国章。FFmpeg中稱(chēng)之為“mpeg”范圍具钥。
以JPEG為代表的標(biāo)準(zhǔn)中,Y液兽、U骂删、V的取值范圍都是0-255。FFmpeg中稱(chēng)之為“jpeg” 范圍四啰。
實(shí)際中最常見(jiàn)的是第1種取值范圍的YUV(可以自己觀察一下YUV的數(shù)據(jù)宁玫,會(huì)發(fā)現(xiàn)其中亮度分量沒(méi)有取值為0、255這樣的數(shù)值)柑晒。很多人在這個(gè)地方會(huì)有疑惑欧瘪,為什么會(huì)去掉“兩邊”的取值呢?
原因:
在廣播電視系統(tǒng)中不傳輸很低和很高的數(shù)值匙赞,實(shí)際上是為了防止信號(hào)變動(dòng)造成過(guò)載恋追,因而把這“兩邊”的數(shù)值作為“保護(hù)帶”[4]。
下面這張圖是數(shù)字電視中亮度信號(hào)量化后的電平分配圖罚屋。從圖中可以看出。
對(duì)于8bit量化來(lái)說(shuō)嗅绸,信號(hào)的白電平為235脾猛,對(duì)應(yīng)模擬電平為700mV。
黑電平為16鱼鸠,對(duì)應(yīng)模擬電平為0mV猛拴。
信號(hào)上方的“保護(hù)帶”取值范圍是236至254羹铅,而信號(hào)下方的“保護(hù)帶”取值范圍是1-15。
最邊緣的0和255兩個(gè)電平是保護(hù)電平愉昆,是不允許出現(xiàn)在數(shù)據(jù)流中的职员。
與之類(lèi)似,10bit量化的時(shí)候跛溉,白電平是235*4=940焊切,黑電平是16*4=64。
quantization_yuv.jpg
下面兩張圖是數(shù)字電視中色度信號(hào)量化后的電平分配圖芳室∽ǚ荆可以看出:
色度最大正電平為240,對(duì)應(yīng)模擬電平為+350mV堪侯。
色度最大負(fù)電平為16嚎尤,對(duì)應(yīng)模擬電平為-350mV。
需要注意的是伍宦,色度信號(hào)數(shù)字電平128對(duì)應(yīng)的模擬電平是0mV芽死。
quantization_2.jpg
quantization_3.jpg
3. YUV的存儲(chǔ)格式
YUV格式有兩大類(lèi):planar和packed。
對(duì)于 planar 的 YUV 格式次洼,先連續(xù)存儲(chǔ)所有像素點(diǎn)的 Y关贵,緊接著存儲(chǔ)所有像素點(diǎn)的 U,隨后是所有像素點(diǎn)的 V滓玖。相當(dāng)于將 YUV 拆分成三個(gè)平面 (plane) 存儲(chǔ)坪哄。
對(duì)于 packed 的 YUV 格式,每個(gè)像素點(diǎn)的 Y势篡,U翩肌,V 是連續(xù)交替存儲(chǔ)的。
4. YUV的采樣格式
主要的采樣格式有YUV4:4:4禁悠、YUV4:2:2念祭、YUV4:2:0 ,其中YUV4:2:0是最常用的采樣格式碍侦。
采樣就是根據(jù)一定的間隔取值粱坤。其中的比例是指 Y、U瓷产、V 表示的像素站玄,三者分別占的比值。
下圖是YUV4:4:4濒旦,YUV4:2:2株旷,YUV4:2:0的采樣示意圖。
image
YUV 4:4:4采樣,每一個(gè)Y對(duì)應(yīng)一組UV分量晾剖。
YUV 4:2:2采樣锉矢,每?jī)蓚€(gè)Y共用一組UV分量。
YUV 4:2:0采樣齿尽,每四個(gè)Y共用一組UV分量沽损。
5. 存儲(chǔ)方式
下面用圖的形式給出常見(jiàn)的YUV數(shù)據(jù)的存儲(chǔ)方式,并在后面附有取樣每個(gè)像素點(diǎn)的YUV數(shù)據(jù)的方法循头。
(1) YUYV 格式 (屬于YUV422)
YUYV.png
相鄰的兩個(gè)Y共用其相鄰的兩個(gè)Cb绵估、Cr,對(duì)于像素點(diǎn)Y'00贷岸、Y'01 而言壹士,其Cb、Cr的值均為 Cb00偿警、Cr00躏救,其他的像素點(diǎn)的YUV取值依次類(lèi)推。
(2) UYVY 格式 (屬于YUV422)
YUYV.png
與YUYV不同的是UV的排列順序不一樣螟蒸,還原其每個(gè)像素點(diǎn)的YUV值的方法與上面一樣盒使。
(3) YUV422P(屬于YUV422)
YUV422P.png
YUV422P是一種平面模式,其每一個(gè)像素點(diǎn)的YUV值提取方法也是遵循YUV422格式的最基本提取方法七嫌,即兩個(gè)Y共用一個(gè)UV少办。比如,對(duì)于像素點(diǎn)Y'00诵原、Y'01 而言英妓,其Cb、Cr的值均為 Cb00绍赛、Cr00蔓纠。
(4) YUV420P格式(屬于YUV420)
YV12.png
YUV420P,Y吗蚌,U腿倚,V三個(gè)分量都是平面格式,分為I420和YV12蚯妇。I420格式和YV12格式的不同處在U平面和V平面的位置不同敷燎。注意,上圖中箩言,Y'00硬贯、Y'01、Y'10陨收、Y'11共用Cr00饭豹、Cb00,其他依次類(lèi)推。在I420格式中墨状,U平面緊跟在Y平面之后,然后才是V平面(即:YUV)菲饼;但YV12則是相反(即:YVU)肾砂。
YUV420p.png
I420: YYYYYYYY UU VV
YV12: YYYYYYYY VV UU
(5) NV12、NV21(YUV420sp宏悦,屬于YUV420)
NV12.png
這兩種格式的不同在于UV交錯(cuò)排列的順序不同镐确,是一種two-plane模式,即Y和UV分為兩個(gè)Plane饼煞,但是UV(CbCr)為交錯(cuò)存儲(chǔ)源葫,而不是分為三個(gè)plane。其提取方式與上一種類(lèi)似砖瞧,即Y'00息堂、Y'01、Y'10块促、Y'11共用Cr00荣堰、Cb00,其他依次類(lèi)推竭翠。
假設(shè)一個(gè)分辨率為8X4的YUV圖像振坚,它們的格式如下圖:
YUV420sp格式如下圖
YUV420sp.png
NV12: YYYYYYYY UVUV
NV21: YYYYYYYY VUVU
以w*h大小圖像的YUV420數(shù)據(jù)為例,
其存儲(chǔ)格式是: 共大小為(w * h * 3/2)字節(jié)斋扰,
Y分量:(w * h)個(gè)字節(jié)
U(Cb)分量:(w * h/4)個(gè)字節(jié)
V(Cr)分量:(w * h/4)個(gè)字節(jié)
6. 10bit YUV數(shù)據(jù)的存儲(chǔ)
常見(jiàn)的yuv數(shù)據(jù)渡八,每個(gè)像素的一個(gè)通道一般是占用一個(gè)字節(jié)即8bit。而HDR常用的標(biāo)準(zhǔn)HDR10传货,數(shù)據(jù)是10bit的屎鳍。
10bit數(shù)據(jù)是怎么存儲(chǔ)的呢?我們一般會(huì)有兩種想法:
每個(gè)像素的一個(gè)通道占用兩個(gè)字節(jié)损离,其中6個(gè)bit是填充位哥艇。
每個(gè)像素的一個(gè)通道占用10bit,10bit數(shù)據(jù)和10bit數(shù)據(jù)是挨著排列的僻澎。
優(yōu)缺點(diǎn)
方式1:便于運(yùn)算處理貌踏,有存儲(chǔ)冗余;
方式2:存儲(chǔ)沒(méi)有冗余窟勃,計(jì)算麻煩祖乳。
事實(shí)上,10bit是采用方式1存儲(chǔ)的秉氧,并且高有效字節(jié)的前6個(gè)bit是填充的0眷昆。
HDR10視頻解碼得到Y(jié)UV數(shù)據(jù)的命令:
//yuv420p10le格式ffmpeg-i hdr10.mp4-f rawvideo-pix_fmt yuv420p10be hdr10_yuv420p10le.yuv//yuv420p10be格式ffmpeg-i hdr10.mp4-f rawvideo-pix_fmt yuv420p10be hdr10_yuv420p10le.yuv
(1)yuv420p10le的數(shù)據(jù)格式的16進(jìn)制的顯示:
image.png
比如地址019f7040h開(kāi)始的兩個(gè)字節(jié):
-------------低地址---->高地址--------------0001111100000001
(2)yuv420p10be的數(shù)據(jù)格式的16進(jìn)制的顯示:
image.png
比如地址019f7040h開(kāi)始的兩個(gè)字節(jié):
-------------低地址---->高地址--------------0000000100011111
工具推薦:一個(gè)可以播放10bit yuv流的播放器YUV Player