YUV420 or 444?關(guān)于視頻格式問(wèn)題
本文主要通過(guò)解釋420和444采樣區(qū)別,來(lái)說(shuō)明一下視頻播放的那些事兒,以及我自己視頻的格式選擇問(wèn)題。

首先我們來(lái)看一個(gè)視頻的MediaInfo信息(一般播放器右鍵屬性里的東西)
從這段Info中可以易得這是個(gè)MKV封裝,分辨率?3840x2072?HEVC編碼視頻流,F(xiàn)LAC無(wú)損壓縮雙聲道音頻流,并附有PGS圖形字幕。
以上信息如果看過(guò)一些關(guān)于視頻的封裝格式和編碼格式的科普應(yīng)該都能分析出,所以這不是本篇的重點(diǎn),本篇關(guān)注的是以下三個(gè)參數(shù)。
我們可以稱這個(gè)視頻是YUV444P10的,而絕大多數(shù)的視頻是YUV420P8的。
色彩空間(Color space)
我們應(yīng)該都知道光的三原色為紅綠藍(lán)(Red?Green?Blue),圖像每個(gè)像素的顏色可以用RGB對(duì)應(yīng)不同的強(qiáng)度值來(lái)表示任何顏色,而我們?cè)谝曨l中所使用的是YUV可以認(rèn)為是顏色的另一種表示量化方式,用亮度和色度的方式表示顏色。RGB?YUV二者之間可以通過(guò)乘矩陣來(lái)相互變換。
舉個(gè)例子,將一個(gè)圖片分別用RGB和YUV(YCbCr)分離表示:


我們可以發(fā)現(xiàn)RGB下三個(gè)通道基本都可以辨別圖像,而YUV下僅亮度(Y)通道可辨別,其他幾乎無(wú)法辨認(rèn)原圖,因?yàn)槿搜蹖?duì)色度不敏感。因此,如果我們?cè)谟袚p壓縮圖像時(shí),降低色度通道的質(zhì)量也不會(huì)對(duì)圖像質(zhì)量產(chǎn)生明顯劣化。諸如H264、HEVC等視頻壓縮編碼,以及jpeg圖片壓縮都是使用YUV空間對(duì)顏色進(jìn)行量化的,再在此基礎(chǔ)上進(jìn)行壓縮編碼
色度抽樣(Chroma?Subsampling)
上面我描述了YUV色彩空間,一般來(lái)說(shuō)每個(gè)像素都對(duì)應(yīng)有各自的YUV數(shù)值,所以拆分開(kāi)的三個(gè)通道的分辨率都應(yīng)該是與原圖相同的。比如一張分辨率3840x2160的YUV圖片,Y通道是3840x2160,UV通道各自應(yīng)也是3840x2160。這種情況就是所謂的4:4:4采樣(YUV444)
上面我們了解了,人眼對(duì)色度的不敏感,壓縮時(shí)可以適當(dāng)損失UV通道的質(zhì)量。我們甚至可以直接對(duì)UV通道的分辨率進(jìn)行降低來(lái)存儲(chǔ)圖像,在還原圖像時(shí)再把UV通道的拉伸回原分辨率,這樣產(chǎn)生的畫質(zhì)損失也是比較小的。YUV 4:2:0采樣便是將UV通道的分辨率長(zhǎng)寬都縮至1/2,還是以3840x2160的圖片為例,420采樣下,UV通道分辨率僅1920x1080。
在色度抽樣下,圖像的體積在未進(jìn)行復(fù)雜的壓縮處理下,體積便可縮小一半,在壓縮編碼時(shí)處理的數(shù)據(jù)量就小了,編解碼速度也會(huì)提升。視頻無(wú)非就是壓縮一堆圖片,所以使用420抽樣即可提升編碼速度和解碼壓力。

位深(Bit?depth)
上面說(shuō)的不管是RGB空間還是YUV空間,每個(gè)像素的都有三個(gè)強(qiáng)度值,這些值在計(jì)算機(jī)中以二進(jìn)制數(shù)表示,位深就是這些二進(jìn)制數(shù)的位數(shù)。簡(jiǎn)單說(shuō)8位色深可以把最暗到最亮分成2的8次方256個(gè)級(jí)別,10位色深即2的10次方1024個(gè)級(jí)別,10位色深的顏色過(guò)渡可以比8位更平滑。

視頻播放時(shí)播放器的工作
一般打開(kāi)一個(gè)視頻文件,播放器會(huì)調(diào)用對(duì)應(yīng)封裝格式的分離器讀取其中的各個(gè)視頻流、音頻流、以及可能有的字幕等。
視頻碼流會(huì)交給視頻解碼器,音頻碼流會(huì)交給音頻解碼器。
視頻解碼器分硬件解碼器和軟件解碼器,硬解即調(diào)用專用解碼電路(電腦上一般與GPU整合在一起),軟解即使用CPU的通用計(jì)算能力解碼。硬解碼能力是硬件固有的,并且支持程度非常細(xì)分與分辨率、編碼格式、色度抽樣和色深都相關(guān)。軟件解碼,顧名思義只要電腦安裝了對(duì)應(yīng)的解碼器軟件,并且CPU不缺少解碼必須的指令集,便可解碼該格式,只是CPU的性能是否可以支撐流暢的輸出。
不管是硬解還是軟解,都是將H264、HEVC等編碼流,解碼成YUV數(shù)據(jù)流(也就是YUV空間表示的一堆圖片流),一開(kāi)頭所舉的視頻為例,解碼后就是YUV444P10格式的3840x2072圖像流。由于顯示器的每個(gè)像素是用RGB來(lái)顯示的,YUV需要轉(zhuǎn)RGB空間推給顯示器。而且不是所有顯示器會(huì)與視頻分辨率相匹配,YUV三個(gè)通道需要各自縮放到顯示器的目標(biāo)分辨率,這項(xiàng)工作就是渲染器在完成。
以我自己的播放器配置為例:MPC-BE + LAV Filter + MadVR + XySubFilter
LAV Filter?中包含了分離器和音視頻解碼器,MadVR即渲染器,XySubFilter即字幕渲染器。
下面展示一些播放時(shí)MadVR的OSD,來(lái)加深對(duì)YUV420和YUV444的理解。
1.3840x2072?YUV444?目標(biāo)2560x1440顯示

OSD顯示image以SSim算法縮小至目標(biāo),因?yàn)閅UV三通道分辨率相同,均為3840x2072。
2.3840x2072?YUV420?目標(biāo)2560x1440顯示

OSD顯示Chroma色度以NGU?Anti-alias (med)?放大,image以SSim算法縮小至目標(biāo)。這時(shí)視頻的UV色度分辨率為1920x1036,MadVR將其放大2倍,再與Y平面一起縮小至目標(biāo)
3.3840x2072?YUV420?目標(biāo)1920x1036顯示

OSD顯示luma以SSim算法縮小至目標(biāo),這里的目標(biāo)分辨率與色度的相同,MadVR僅對(duì)Y亮度平面進(jìn)行了縮小。

對(duì)我現(xiàn)在的4K視頻格式的說(shuō)明
目前我的4K視頻的源視頻(上傳給B站的文件)的格式是MKV封裝,HEVC編碼YUV420P10,音頻格式視素材源而定,盡量無(wú)損FLAC。
寫這篇文章,主要是有人對(duì)我之前的無(wú)聊測(cè)試(CV12560715)中的YUV444P10視頻表示疑問(wèn)。他的疑問(wèn)主要是444全采樣與420清晰度畫質(zhì)沒(méi)區(qū)別,沒(méi)必要壓制444的視頻;素材是8bit的沒(méi)必要壓制10bit。
其實(shí)這些問(wèn)題在早年的VCB科普中都可以解答(CV1859841?B站轉(zhuǎn)載版),雖然當(dāng)時(shí)我介紹了這個(gè)科普,但我還是覺(jué)得自己詳細(xì)回答一下。
首先簡(jiǎn)要描述我的處理4K超分辨率視頻的流程,拿到一個(gè)視頻(一般都是420采樣的色深有8bit也有10bit)會(huì)對(duì)其進(jìn)行UV色度升頻(放大)并轉(zhuǎn)換成RGB24(8bit色深的RGB)。
這里可能會(huì)有疑問(wèn),10bit視頻怎么會(huì)降色深?目前這是軟硬件的限制,我使用的超分軟件TVE要輸出16bit的只能選擇未壓縮,一個(gè)視頻下來(lái)硬盤占用太大,理想情況下是應(yīng)該全程16bit精度的。并且這是8bit的RGB不是8bit的YUV,對(duì)于RGB來(lái)說(shuō)降低精度不會(huì)像YUV強(qiáng)行降低精度產(chǎn)生色帶等問(wèn)題。
接著,RGB數(shù)據(jù)會(huì)以PNG無(wú)損壓縮輸出成圖片序列,使用TVE超分,得到高分辨率的PNG?RGB24圖片序列,再組合圖片序列,添加幀率信息,轉(zhuǎn)YUV空間,輸出給x265編碼器壓制成視頻。
回答第一個(gè)問(wèn)題,關(guān)鍵在最后的從RGB轉(zhuǎn)回YUV的操作RGB是沒(méi)有420采樣一說(shuō)的,它和YUV444是可以通過(guò)特定的矩陣互向可逆變換的,在最終輸出時(shí)沒(méi)必要降采UV色度的。我在前文所說(shuō)影響YUV圖像效果主要是Y平面,只要Y平面分辨率沒(méi)有損失,畫質(zhì)不會(huì)有太大的損失。444解決的主要是一些特定情況的顏色失真,在動(dòng)畫中不太明顯。壓制444視頻是在最大限度的顏色保真。實(shí)際生活中遇到的很少,我自己通常還是以420視頻為主,444視頻的編解碼壓力很大。
至于10bit的色深,YUV與RGB的互轉(zhuǎn)是個(gè)浮點(diǎn)計(jì)算,使用提高精度輸入轉(zhuǎn)換后的精度更準(zhǔn),實(shí)際RGB 8bit轉(zhuǎn)YUV444P16是可以填充多出來(lái)的8位,在者我在處理過(guò)程需要添加濾鏡(抗色帶等),這些濾鏡也是16bit精度的。所以如編碼器允許我甚至可以輸出YUV420P16。但是x265最高12bit,考慮到播放的壓力以及10bit完全可做到看不出色帶,最終選擇YUV420P10。(YUV420P8其實(shí)也可通過(guò)添加噪點(diǎn)等手段來(lái)掩蓋色帶,但這會(huì)付出更大體積的代價(jià))

參考資料:https://vcb-s.com/archives/2726

YUV與RGB互轉(zhuǎn)進(jìn)階:
https://vcb-s.nmm-hd.org/Templar%20Archive/
[教程18]YUV與RGB的互轉(zhuǎn)(1)? 主要涉及YUV420的Chroma?placement?對(duì)齊的問(wèn)題,以及RGB與YUV互轉(zhuǎn)的幾種matrix。