聊一聊視頻清晰度優(yōu)化指南
一、背景介紹
隨著移動(dòng)互聯(lián)網(wǎng)的深入發(fā)展,視頻消費(fèi)場景逐漸變成主流,早期由于手機(jī)硬件的限制問題,導(dǎo)致生產(chǎn)出來的視頻畫質(zhì)、清晰度存在較大的問題,用戶體驗(yàn)不太好,當(dāng)時(shí)的網(wǎng)絡(luò)也處于4G的發(fā)展階段,網(wǎng)絡(luò)的限制也無法持續(xù)支持高清視頻的消費(fèi),但是現(xiàn)在5G發(fā)展地如火如荼,網(wǎng)絡(luò)的高速發(fā)展,手機(jī)硬件性能的提升,用戶越來越不滿足于低畫質(zhì)和低清晰度的視頻。提升視頻的畫質(zhì)和清晰度勢在必行,需要一套行之有效提升視頻清晰度的優(yōu)化方案。
二、評(píng)價(jià)標(biāo)準(zhǔn)
做一件事情之前,首先需要確定一下評(píng)價(jià)這件事情的標(biāo)準(zhǔn)。所以在提出視頻清晰度優(yōu)化方案之前,必須先確定一下衡量視頻清晰度的評(píng)價(jià)準(zhǔn)則。評(píng)價(jià)視頻清晰度有兩種準(zhǔn)則:
2.1 客觀標(biāo)準(zhǔn)
客觀標(biāo)準(zhǔn)就是利用算法計(jì)算視頻畫面質(zhì)量分,同等條件下,如果A視頻的質(zhì)量分得到高于B視頻,說明A視頻的保真質(zhì)量做得比B視頻更好。評(píng)估視頻質(zhì)量的算法有兩大類:
- 完全參考:兩個(gè)視頻逐幀對(duì)比分析,計(jì)算對(duì)比的質(zhì)量,這種使用的比較多,常見的VMAF、PSNR、SSIM都是完全參考。
- 部分參考:截圖視頻中的部分幀來對(duì)比分析。有些場景例如直播沒法完全對(duì)比,截取部分幀來對(duì)比是比較科學(xué)的。
目前Netflix推出的VMAF算法是評(píng)價(jià)視頻質(zhì)量的主流算法,下面我們簡單介紹一下:
- VMAF 全稱 Video Multi-method Assessment Fusion ,它借助人類視覺模型以及機(jī)器學(xué)習(xí)來評(píng)估一個(gè)視頻的質(zhì)量。
- VMAF的評(píng)價(jià)指標(biāo)主要包含:其中VIF和DLM是空間域的,表示一幀畫面之內(nèi)的特征;TI是時(shí)間域的,表示多幀畫面之間的相關(guān)性特征。
視頻信息保真度(VIF:Visual Quality Fidelity)
細(xì)節(jié)損失指標(biāo)(DLM:Detail Loss Measure)
時(shí)域運(yùn)動(dòng)指標(biāo)/平均相關(guān)位置像素差(TI:Temporal Information)
- VMAF基于SVM的nuSvr算法,在運(yùn)行的過程中,根據(jù)事先訓(xùn)練好的model,賦予每種視頻特征以不同的權(quán)重,對(duì)每一種畫面都生成一個(gè)評(píng)分,最終以均值算法進(jìn)行歸總,算出該視頻的最終評(píng)分。
- VMAF計(jì)算出的分?jǐn)?shù)范圍是0 ~ 100,其中0表示最低質(zhì)量,100表示最高質(zhì)量,后續(xù)對(duì)比的時(shí)候只給出分?jǐn)?shù)。
2.2 主觀標(biāo)準(zhǔn)
客觀標(biāo)準(zhǔn)固然重要,但是視頻是給人看的,最終視頻的質(zhì)量好不好,還需要用戶主觀感受。換言之,兩個(gè)視頻的VMAF可能相近,但是用戶觀感可能會(huì)不一樣,有些用戶喜歡柔色,有些用戶喜歡暖色。
主觀標(biāo)準(zhǔn)操作起來比較簡單,找?guī)讉€(gè)視頻,讓用戶觀看之后主觀給出評(píng)價(jià),視頻A和視頻B的質(zhì)量對(duì)比如何,這種輸出的結(jié)果比較準(zhǔn)確,但是工作量比較大,不好大范圍推廣。所以根據(jù)項(xiàng)目要求,在特定的時(shí)候采用客觀評(píng)價(jià)標(biāo)準(zhǔn),在某些場景采用主觀評(píng)價(jià)標(biāo)準(zhǔn)。
例如下面兩張圖片,它們的VMAF值是相近的,但是第二張看上去明顯比第一張畫質(zhì)好多了,而且更加明亮,這并沒有改變圖片的編碼結(jié)構(gòu),只是對(duì)畫面本身進(jìn)行一些調(diào)色處理(這個(gè)我們下面會(huì)單獨(dú)拎出來講),就能明顯提升主觀感受。所以評(píng)價(jià)視頻質(zhì)量需要綜合主觀標(biāo)準(zhǔn)和客觀標(biāo)準(zhǔn)綜合來判斷。而且我們建議在有條件的情況下,主觀標(biāo)準(zhǔn)更加重要,因?yàn)榭陀^標(biāo)準(zhǔn)只是模擬人眼的視覺系統(tǒng),和真實(shí)的場景還是有所差距。


三、基礎(chǔ)優(yōu)化
通過上面的描述我們基本了解了視頻質(zhì)量的評(píng)價(jià)標(biāo)準(zhǔn),但如果要提升視頻質(zhì)量,這些還不夠,我們還需要介紹一下視頻的基本屬性,以及這些屬性可以在多大程度上影響視頻的質(zhì)量。
我們首先使用MediaInfo來查看一下視頻的屬性,由于重點(diǎn)關(guān)注畫質(zhì),所以就自動(dòng)忽略封裝格式和音頻流信息,只關(guān)注視頻軌道信息:
其中有幾個(gè)非常重要的屬性需要特別關(guān)注一下:下面我們列出的各個(gè)屬性都是基于其他條件不變的情況下,只改變當(dāng)前屬性。例如談Profile,就要保證其他的屬性是相同的,只有Profile不同,這樣比較視頻的畫質(zhì)才有意義。
3.1 Profile
Profile對(duì)應(yīng)上面的是Encoder Profile Level,正常情況下,Profile Level有三種類型:
- Baseline Profile
- Main Profile
- High Profile
其中Baseline Profile對(duì)應(yīng)清晰度最低,Android 3.0之后的版本都支持的,Main Profile清晰度比Baseline Profile清晰度要好,但是從Android 7.0之后才支持,High Profile清晰度最高,也是從Android 7.0之后才支持。我們?cè)谠O(shè)置Encoder Profile Level之前,需要判斷一下當(dāng)前是否支持。
3.2 Bitrate碼率
視頻碼率是視頻數(shù)據(jù)傳輸時(shí)單位時(shí)間內(nèi)傳送的數(shù)據(jù)位數(shù)。單位是kbps,望文生義,碼率越大,單位時(shí)間填充的數(shù)據(jù)就越多,視頻質(zhì)量就越高。
碼率并不是越大越好,碼率設(shè)置超過一定的大小,對(duì)視頻畫質(zhì)的提升已不太明顯,肉眼已經(jīng)看不出區(qū)別,但是視頻大小會(huì)增加很多。所以設(shè)置合適的碼率就行。通常建議的碼率計(jì)算方式是:
按照上面的公式設(shè)置的碼率是比較合適的,當(dāng)然如果想要更加高清的,可以適當(dāng)增加factor大小。
3.3 Bitrate Mode
碼率雖然設(shè)置了,但是碼率是描述一段時(shí)間的平均傳輸?shù)臄?shù)據(jù)位數(shù),無法保證每一個(gè)時(shí)間段內(nèi)傳送的數(shù)據(jù)大小是固定的或者在一個(gè)固定的范圍內(nèi)。還有一個(gè)Bitrate Mode參數(shù)來表示碼率模式。它也有三種類型:
- VBR:可變碼率(Variable Bitrate), 此編碼方式會(huì)根據(jù)幀間數(shù)據(jù)的變化量大小來動(dòng)態(tài)調(diào)整碼率,如果幀間的運(yùn)動(dòng)變化比較大,調(diào)高碼率,如果幀間的運(yùn)動(dòng)變化比較小,調(diào)小碼率。從編碼方式就可以看出來,這樣的編碼方式有兩個(gè)缺點(diǎn):(1)運(yùn)動(dòng)預(yù)測計(jì)算算法有一定的耗時(shí),編碼時(shí)間較長;(2)碼率多變,最終生成的文件大小不可預(yù)測。可能很大也可能很小。
- CBR:固定碼率或者常數(shù)碼率(Constant Bitrate), 這是默認(rèn)的編碼方式,使用此編碼方式,文件從始至終的編碼碼率會(huì)固定不變或者基本不變。這種方式的好處是文件大小是確定的,不會(huì)出現(xiàn)文件大小不可預(yù)測的情況。但是缺點(diǎn)也很明顯,有時(shí)候幀間變化比較大,有時(shí)候幀間變化比較小,如果都使用同樣的碼率,幀間變化比較大的時(shí)間畫質(zhì)會(huì)比較一般,幀間變化比較小的時(shí)間顯得浪費(fèi)。無法做到較好的平衡。
- ABR:平均碼率(Average Bitrate), 平均碼率較好地兼顧了VBR和CBR的,在幀間變化比較大的時(shí)間使用較大的碼率,在幀間變化比較小的時(shí)間采用較小的碼率,最終保證整體采用的碼率固定就可以了。較好的處理了畫質(zhì)和文件大小之間的矛盾。
但是很可惜的是MediaCodec并不支持ABR,我們?nèi)绻氩捎肁BR模式的話還需要使用軟編碼。MediaCodec也提供了三種模式:
BITRATE_MODE_CQ:這種模式是全面考慮視頻質(zhì)量,盡可能保證視頻質(zhì)量,所以編碼出來的視頻都很大,并不可取。
- BITRATE_MODE_VBR:同上面的VBR
- BITRATE_MODE_CBR:同上面的CBR
眾所周知,硬編碼速度要遠(yuǎn)遠(yuǎn)快于軟編碼,所以編碼都是優(yōu)先采用硬編碼,硬編碼失敗再采用軟編碼兼容。所以硬編碼MediaCodec建議采用BITRATE_MODE_CBR模式,切換到軟編碼采用VBR模式。
3.4 B幀設(shè)置
視頻由I幀、P幀、B幀 三種類型的視頻幀組成的。
I幀是幀內(nèi)圖像幀,就是關(guān)鍵幀,意思是此幀不需要依賴其他的幀就可以進(jìn)行編碼或者解碼。
P幀是前向預(yù)測圖像幀,此幀需要參考在它之前的I幀或者P幀,采用運(yùn)動(dòng)預(yù)測的方式進(jìn)行幀間編碼或者解碼。P幀大小相當(dāng)于I幀大小的1/10 ~ 1/20。
B幀是雙向預(yù)測圖像幀,此幀需要參考在它之前的I幀或者P幀,也需要參考在它之后的I幀或者P幀,采用運(yùn)動(dòng)預(yù)測的方式進(jìn)行幀間預(yù)測編碼或者解碼。
GOP表示兩個(gè)I幀之間的圖像幀序列,GOP=2s,表示兩個(gè)I幀之間的間隔是2s。
Android平臺(tái)只有高通部分芯片支持B幀編碼,并且Android系統(tǒng)也沒有開發(fā)設(shè)置B幀的接口,所以對(duì)使用Android MediaCodec編碼的開發(fā)者而言,無法開啟B幀編碼(iOS是可以的,暗自垂淚)。當(dāng)然軟編碼是可以設(shè)置B幀的。
設(shè)置B幀有什么好處?
B幀大小約是I幀大小的1/50,如果設(shè)置了B幀了,并不會(huì)降低清晰度,但是可以大大降低視頻的大小,這樣我們就可以相應(yīng)地調(diào)大碼率,最終實(shí)現(xiàn)了提升清晰度的目標(biāo)。
當(dāng)然設(shè)置了B幀之后,增加了編碼和解碼的復(fù)雜度,這點(diǎn)開發(fā)者在設(shè)置的時(shí)候必須要有充分的認(rèn)識(shí)。
四、HEVC編碼
目前H.264編碼還是使用最廣泛的編碼方式,主要還是H.264編碼的兼容性比較好,而且免費(fèi)開源。HEVC自從2013年第一版發(fā)布開源出來,還沒有完全替代H.264(主要原因是收費(fèi),而且部分機(jī)型可能不支持),不過HEVC憑借其獨(dú)特的優(yōu)勢也得到了較多地應(yīng)用。
HEVC相對(duì)H.264的優(yōu)勢:
- HEVC標(biāo)準(zhǔn)視頻的幀內(nèi)預(yù)測模式支持33種方向,并且提供了更好的運(yùn)動(dòng)補(bǔ)償處理和矢量預(yù)測方法。而H.264只支持8種。
- HEVC采用了塊的四叉樹劃分結(jié)構(gòu),采用了8x8 ~ 64 x 64 像素的自適應(yīng)塊劃分,而H.264每個(gè)宏塊的大小都是固定的16 x 16像素,HEVC的這樣設(shè)計(jì)可以保證在不同的幀間和幀內(nèi)復(fù)雜程度中可以動(dòng)態(tài)調(diào)整宏塊的大小,經(jīng)過測試發(fā)現(xiàn),在相同的圖像質(zhì)量下,HEVC編碼的視頻比H.264編碼的視頻約減少40%,換言之,如果HEVC和H.264碼率相同,那么HEVC編碼的視頻比H.264編碼的視頻要清晰地多。

上圖可以看出同樣的視頻幀,HEVC使用的宏塊比H.264要少很多,體現(xiàn)了HEVC的優(yōu)勢。
分辨率 | H.264/AVC | H.265/HEVC |
480p | 1.5 Mbps | 0.75 Mbps |
720p | 3 Mbps | 1.5 Mbps |
1080p | 6 Mbps | 3 Mbps |
4k | 32 Mbps | 15 Mbps |
我們?cè)谑褂肕ediaCodec HEVC硬編碼時(shí),需要判斷一下當(dāng)前是否支持HEVC編碼,Android 5.0已經(jīng)支持了HEVC,不過一些低端芯片可能還是沒有支持HEVC,我們?cè)诰幋a之前需要判斷一下是否支持。
使用HEVC編碼,可以保證在不增加文件大小的情況下,大大提升視頻的清晰度。
上圖是H.264編碼,下圖是HEVC編碼。


五、色彩調(diào)優(yōu)
上面的幾種優(yōu)化方式都是在編碼層面調(diào)整參數(shù)或者直接改變編碼方式來提升視頻的畫質(zhì),但有一種方式通過調(diào)整視頻畫面的色值——綜合調(diào)整亮度、對(duì)比度、色溫、飽和度、銳度等顏色參數(shù),進(jìn)而優(yōu)化整體的視頻畫面,讓視頻畫面看上去“更清晰”。

我們經(jīng)常用到的顏色空間有RGB顏色空間、HSV顏色空間、YUV顏色空間還有CIELab顏色空間,其中RGB顏色空間使用的比較廣泛。如上圖,圖像分為三個(gè)通道量:R分量、G分量、B分量,每個(gè)分量的值是0 ~ 255,三個(gè)分量共同組成一個(gè)顏色的RGB值。RGB分量的值分布構(gòu)成了顏色色值的直方圖,我們通過調(diào)節(jié)RGB值來調(diào)節(jié)圖像的顏色。

有幾種對(duì)顏色色值的調(diào)節(jié)方式,對(duì)我們理解顏色調(diào)節(jié)有很大的幫助:
- 亮度:亮度表示人眼對(duì)發(fā)光體或被照射物體表面的發(fā)光或反射光強(qiáng)度實(shí)際感受的物理量,簡而言之,RGB分量越大,圖像就越亮;反之,圖像越暗。
- 對(duì)比度:圖像對(duì)比度是指圖像中從黑色到白色漸變的層次反差或比值。反差越大,比值越大,從視覺上感知,圖像就越清晰醒目,對(duì)比度越大;反差越小,比值越小,從視覺上感知,圖像越不清晰醒目,蒙塵感越強(qiáng),對(duì)比度越小。
- 色溫:色溫和溫度還真有一定的關(guān)系,表示絕對(duì)黑體從絕對(duì)零度開始加熱之后呈現(xiàn)的顏色。從我們生活中來看,暖色調(diào)看上去比較溫馨,冷色調(diào)感受上有點(diǎn)清涼。
- 飽和度:飽和度是指色彩的鮮艷程度或者純度。飽和度越高,圖像色彩越鮮艷,色彩純度越高;反之則越低,直至灰度圖。
- 銳度:銳度主要用來表示圖像邊緣的對(duì)比度,由于人類感官,高銳度的圖像看起來更加清晰,圖像上的細(xì)節(jié)對(duì)比非常明顯。
我們可以將上面五種調(diào)節(jié)方式綜合起來調(diào)節(jié)圖片色彩。
- 亮度增加10個(gè)點(diǎn)(-100 ~ 100)
- 色溫增加5個(gè)點(diǎn)(-100 ~ 100)
- 飽和度增加20個(gè)點(diǎn)(0 ~ 100)
- 銳度增加15個(gè)點(diǎn)(0 ~ 100)
第一張是原圖,第二張是經(jīng)過顏色調(diào)節(jié)之后輸出的圖片。


六、超分算法
上面提到的優(yōu)化方式無論從編碼層面,還是從顏色調(diào)節(jié)層面,都算是基本的優(yōu)化方式,近年來,隨著機(jī)器學(xué)習(xí)的火熱,超分算法越來越廣泛地應(yīng)用到圖像和視頻處理上來。超分辨率就是指通過機(jī)器學(xué)習(xí)地方式重建圖像,達(dá)成提升圖像分辨率的效果。
目前比較成熟的超分技術(shù)是Real-ESRGAN,基于BasicSR,采用ESRGAN算法,利用機(jī)器學(xué)習(xí)的優(yōu)勢對(duì)圖片和視頻進(jìn)行去模糊、Resize、降噪、銳化等處理,重建圖片,實(shí)現(xiàn)對(duì)圖片的超分辨率處理。
E-SR-GAN算法的三個(gè)步驟:
- 特征提取:計(jì)算噪點(diǎn)
- 非線性映射:放大,模糊化噪點(diǎn)
- 圖像重建:差分,平滑過度,去噪

相對(duì)之前的SRCNN等超分算法,改進(jìn)了如下幾點(diǎn):
- 改進(jìn)感知損失,提高輸出圖像的邊緣清晰度和紋理真實(shí)性。
- 利用對(duì)抗網(wǎng)絡(luò)的優(yōu)勢不斷反饋改進(jìn)GAN判別器,預(yù)測高分辨率圖像和原始圖像之前的相對(duì)真實(shí)性而不是絕對(duì)真實(shí)性。可以恢復(fù)原始圖像的真實(shí)的紋理細(xì)節(jié)。
- 優(yōu)化了模型的穩(wěn)定性,每次生成的圖片都和原圖片殘差對(duì)比,進(jìn)行矯正訓(xùn)練,最終得到的結(jié)果非常穩(wěn)定。

下面是超分前后的對(duì)比結(jié)果:大家可以點(diǎn)擊大圖對(duì)比一下細(xì)節(jié),可以看出超分之后的圖片精細(xì)化很多,去掉模糊的地方、降低圖片的噪點(diǎn)。




七、總結(jié)
本文結(jié)合當(dāng)下視頻的痛點(diǎn)(清晰度問題),提出衡量視頻清晰度的標(biāo)準(zhǔn)——主觀標(biāo)準(zhǔn)和客觀標(biāo)準(zhǔn),指明了視頻清晰度的優(yōu)化目標(biāo)和方向,根據(jù)視頻的基本特征(碼率、GOP、編碼模式等)提出基礎(chǔ)優(yōu)化的方法,在基礎(chǔ)優(yōu)化的基礎(chǔ)上提出高級(jí)編碼方式(相對(duì)H.264編碼方式),再結(jié)合目前主流的視頻色彩濾鏡提出視頻色彩調(diào)優(yōu)方案,讓視頻看上去更清晰。最終的大殺器——超分算法采用E-SR-GAN方式進(jìn)行放大、降噪、重建幀來提升視頻清晰度。希望上面這些方法可以給大家?guī)硪恍椭瑢?duì)提升視頻清晰度有更進(jìn)一步的思考。

參考文章:
VMAF開源項(xiàng)目 https://github.com/Netflix/vmaf
揭秘 VMAF 視頻質(zhì)量評(píng)測標(biāo)準(zhǔn)https://xie.infoq.cn/article/26aaf2ab83f56192a65ba22ea
Netflix VMAF 視頻質(zhì)量評(píng)估工具概述https://zhuanlan.zhihu.com/p/94223056
B幀對(duì)視頻清晰度/碼率的影響https://blog.csdn.net/matrix_laboratory/article/details/82726897
H264 vs H265https://www.cnblogs.com/wujianming-110117/p/12640533.html
超分開源項(xiàng)目https://github.com/xinntao/Real-ESRGAN


























