聊一聊視頻清晰度優(yōu)化指南
一、背景介紹
隨著移動互聯(lián)網(wǎng)的深入發(fā)展,視頻消費場景逐漸變成主流,早期由于手機硬件的限制問題,導(dǎo)致生產(chǎn)出來的視頻畫質(zhì)、清晰度存在較大的問題,用戶體驗不太好,當(dāng)時的網(wǎng)絡(luò)也處于4G的發(fā)展階段,網(wǎng)絡(luò)的限制也無法持續(xù)支持高清視頻的消費,但是現(xiàn)在5G發(fā)展地如火如荼,網(wǎng)絡(luò)的高速發(fā)展,手機硬件性能的提升,用戶越來越不滿足于低畫質(zhì)和低清晰度的視頻。提升視頻的畫質(zhì)和清晰度勢在必行,需要一套行之有效提升視頻清晰度的優(yōu)化方案。
二、評價標(biāo)準(zhǔn)
做一件事情之前,首先需要確定一下評價這件事情的標(biāo)準(zhǔn)。所以在提出視頻清晰度優(yōu)化方案之前,必須先確定一下衡量視頻清晰度的評價準(zhǔn)則。評價視頻清晰度有兩種準(zhǔn)則:
2.1 客觀標(biāo)準(zhǔn)
客觀標(biāo)準(zhǔn)就是利用算法計算視頻畫面質(zhì)量分,同等條件下,如果A視頻的質(zhì)量分得到高于B視頻,說明A視頻的保真質(zhì)量做得比B視頻更好。評估視頻質(zhì)量的算法有兩大類:
- 完全參考:兩個視頻逐幀對比分析,計算對比的質(zhì)量,這種使用的比較多,常見的VMAF、PSNR、SSIM都是完全參考。
- 部分參考:截圖視頻中的部分幀來對比分析。有些場景例如直播沒法完全對比,截取部分幀來對比是比較科學(xué)的。
目前Netflix推出的VMAF算法是評價視頻質(zhì)量的主流算法,下面我們簡單介紹一下:
- VMAF 全稱 Video Multi-method Assessment Fusion ,它借助人類視覺模型以及機器學(xué)習(xí)來評估一個視頻的質(zhì)量。
- VMAF的評價指標(biāo)主要包含:其中VIF和DLM是空間域的,表示一幀畫面之內(nèi)的特征;TI是時間域的,表示多幀畫面之間的相關(guān)性特征。
視頻信息保真度(VIF:Visual Quality Fidelity)
細節(jié)損失指標(biāo)(DLM:Detail Loss Measure)
時域運動指標(biāo)/平均相關(guān)位置像素差(TI:Temporal Information)
- VMAF基于SVM的nuSvr算法,在運行的過程中,根據(jù)事先訓(xùn)練好的model,賦予每種視頻特征以不同的權(quán)重,對每一種畫面都生成一個評分,最終以均值算法進行歸總,算出該視頻的最終評分。
- VMAF計算出的分數(shù)范圍是0 ~ 100,其中0表示最低質(zhì)量,100表示最高質(zhì)量,后續(xù)對比的時候只給出分數(shù)。
2.2 主觀標(biāo)準(zhǔn)
客觀標(biāo)準(zhǔn)固然重要,但是視頻是給人看的,最終視頻的質(zhì)量好不好,還需要用戶主觀感受。換言之,兩個視頻的VMAF可能相近,但是用戶觀感可能會不一樣,有些用戶喜歡柔色,有些用戶喜歡暖色。
主觀標(biāo)準(zhǔn)操作起來比較簡單,找?guī)讉€視頻,讓用戶觀看之后主觀給出評價,視頻A和視頻B的質(zhì)量對比如何,這種輸出的結(jié)果比較準(zhǔn)確,但是工作量比較大,不好大范圍推廣。所以根據(jù)項目要求,在特定的時候采用客觀評價標(biāo)準(zhǔn),在某些場景采用主觀評價標(biāo)準(zhǔn)。
例如下面兩張圖片,它們的VMAF值是相近的,但是第二張看上去明顯比第一張畫質(zhì)好多了,而且更加明亮,這并沒有改變圖片的編碼結(jié)構(gòu),只是對畫面本身進行一些調(diào)色處理(這個我們下面會單獨拎出來講),就能明顯提升主觀感受。所以評價視頻質(zhì)量需要綜合主觀標(biāo)準(zhǔn)和客觀標(biāo)準(zhǔn)綜合來判斷。而且我們建議在有條件的情況下,主觀標(biāo)準(zhǔn)更加重要,因為客觀標(biāo)準(zhǔn)只是模擬人眼的視覺系統(tǒng),和真實的場景還是有所差距。
三、基礎(chǔ)優(yōu)化
通過上面的描述我們基本了解了視頻質(zhì)量的評價標(biāo)準(zhǔn),但如果要提升視頻質(zhì)量,這些還不夠,我們還需要介紹一下視頻的基本屬性,以及這些屬性可以在多大程度上影響視頻的質(zhì)量。
我們首先使用MediaInfo來查看一下視頻的屬性,由于重點關(guān)注畫質(zhì),所以就自動忽略封裝格式和音頻流信息,只關(guān)注視頻軌道信息:
其中有幾個非常重要的屬性需要特別關(guān)注一下:下面我們列出的各個屬性都是基于其他條件不變的情況下,只改變當(dāng)前屬性。例如談Profile,就要保證其他的屬性是相同的,只有Profile不同,這樣比較視頻的畫質(zhì)才有意義。
3.1 Profile
Profile對應(yīng)上面的是Encoder Profile Level,正常情況下,Profile Level有三種類型:
- Baseline Profile
- Main Profile
- High Profile
其中Baseline Profile對應(yīng)清晰度最低,Android 3.0之后的版本都支持的,Main Profile清晰度比Baseline Profile清晰度要好,但是從Android 7.0之后才支持,High Profile清晰度最高,也是從Android 7.0之后才支持。我們在設(shè)置Encoder Profile Level之前,需要判斷一下當(dāng)前是否支持。
3.2 Bitrate碼率
視頻碼率是視頻數(shù)據(jù)傳輸時單位時間內(nèi)傳送的數(shù)據(jù)位數(shù)。單位是kbps,望文生義,碼率越大,單位時間填充的數(shù)據(jù)就越多,視頻質(zhì)量就越高。
碼率并不是越大越好,碼率設(shè)置超過一定的大小,對視頻畫質(zhì)的提升已不太明顯,肉眼已經(jīng)看不出區(qū)別,但是視頻大小會增加很多。所以設(shè)置合適的碼率就行。通常建議的碼率計算方式是:
按照上面的公式設(shè)置的碼率是比較合適的,當(dāng)然如果想要更加高清的,可以適當(dāng)增加factor大小。
3.3 Bitrate Mode
碼率雖然設(shè)置了,但是碼率是描述一段時間的平均傳輸?shù)臄?shù)據(jù)位數(shù),無法保證每一個時間段內(nèi)傳送的數(shù)據(jù)大小是固定的或者在一個固定的范圍內(nèi)。還有一個Bitrate Mode參數(shù)來表示碼率模式。它也有三種類型:
- VBR:可變碼率(Variable Bitrate), 此編碼方式會根據(jù)幀間數(shù)據(jù)的變化量大小來動態(tài)調(diào)整碼率,如果幀間的運動變化比較大,調(diào)高碼率,如果幀間的運動變化比較小,調(diào)小碼率。從編碼方式就可以看出來,這樣的編碼方式有兩個缺點:(1)運動預(yù)測計算算法有一定的耗時,編碼時間較長;(2)碼率多變,最終生成的文件大小不可預(yù)測。可能很大也可能很小。
- CBR:固定碼率或者常數(shù)碼率(Constant Bitrate), 這是默認的編碼方式,使用此編碼方式,文件從始至終的編碼碼率會固定不變或者基本不變。這種方式的好處是文件大小是確定的,不會出現(xiàn)文件大小不可預(yù)測的情況。但是缺點也很明顯,有時候幀間變化比較大,有時候幀間變化比較小,如果都使用同樣的碼率,幀間變化比較大的時間畫質(zhì)會比較一般,幀間變化比較小的時間顯得浪費。無法做到較好的平衡。
- ABR:平均碼率(Average Bitrate), 平均碼率較好地兼顧了VBR和CBR的,在幀間變化比較大的時間使用較大的碼率,在幀間變化比較小的時間采用較小的碼率,最終保證整體采用的碼率固定就可以了。較好的處理了畫質(zhì)和文件大小之間的矛盾。
但是很可惜的是MediaCodec并不支持ABR,我們?nèi)绻氩捎肁BR模式的話還需要使用軟編碼。MediaCodec也提供了三種模式:
BITRATE_MODE_CQ:這種模式是全面考慮視頻質(zhì)量,盡可能保證視頻質(zhì)量,所以編碼出來的視頻都很大,并不可取。
- BITRATE_MODE_VBR:同上面的VBR
- BITRATE_MODE_CBR:同上面的CBR
眾所周知,硬編碼速度要遠遠快于軟編碼,所以編碼都是優(yōu)先采用硬編碼,硬編碼失敗再采用軟編碼兼容。所以硬編碼MediaCodec建議采用BITRATE_MODE_CBR模式,切換到軟編碼采用VBR模式。
3.4 B幀設(shè)置
視頻由I幀、P幀、B幀 三種類型的視頻幀組成的。
I幀是幀內(nèi)圖像幀,就是關(guān)鍵幀,意思是此幀不需要依賴其他的幀就可以進行編碼或者解碼。
P幀是前向預(yù)測圖像幀,此幀需要參考在它之前的I幀或者P幀,采用運動預(yù)測的方式進行幀間編碼或者解碼。P幀大小相當(dāng)于I幀大小的1/10 ~ 1/20。
B幀是雙向預(yù)測圖像幀,此幀需要參考在它之前的I幀或者P幀,也需要參考在它之后的I幀或者P幀,采用運動預(yù)測的方式進行幀間預(yù)測編碼或者解碼。
GOP表示兩個I幀之間的圖像幀序列,GOP=2s,表示兩個I幀之間的間隔是2s。
Android平臺只有高通部分芯片支持B幀編碼,并且Android系統(tǒng)也沒有開發(fā)設(shè)置B幀的接口,所以對使用Android MediaCodec編碼的開發(fā)者而言,無法開啟B幀編碼(iOS是可以的,暗自垂淚)。當(dāng)然軟編碼是可以設(shè)置B幀的。
設(shè)置B幀有什么好處?
B幀大小約是I幀大小的1/50,如果設(shè)置了B幀了,并不會降低清晰度,但是可以大大降低視頻的大小,這樣我們就可以相應(yīng)地調(diào)大碼率,最終實現(xiàn)了提升清晰度的目標(biāo)。
當(dāng)然設(shè)置了B幀之后,增加了編碼和解碼的復(fù)雜度,這點開發(fā)者在設(shè)置的時候必須要有充分的認識。
四、HEVC編碼
目前H.264編碼還是使用最廣泛的編碼方式,主要還是H.264編碼的兼容性比較好,而且免費開源。HEVC自從2013年第一版發(fā)布開源出來,還沒有完全替代H.264(主要原因是收費,而且部分機型可能不支持),不過HEVC憑借其獨特的優(yōu)勢也得到了較多地應(yīng)用。
HEVC相對H.264的優(yōu)勢:
- HEVC標(biāo)準(zhǔn)視頻的幀內(nèi)預(yù)測模式支持33種方向,并且提供了更好的運動補償處理和矢量預(yù)測方法。而H.264只支持8種。
- HEVC采用了塊的四叉樹劃分結(jié)構(gòu),采用了8x8 ~ 64 x 64 像素的自適應(yīng)塊劃分,而H.264每個宏塊的大小都是固定的16 x 16像素,HEVC的這樣設(shè)計可以保證在不同的幀間和幀內(nèi)復(fù)雜程度中可以動態(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 |
我們在使用MediaCodec HEVC硬編碼時,需要判斷一下當(dāng)前是否支持HEVC編碼,Android 5.0已經(jīng)支持了HEVC,不過一些低端芯片可能還是沒有支持HEVC,我們在編碼之前需要判斷一下是否支持。
使用HEVC編碼,可以保證在不增加文件大小的情況下,大大提升視頻的清晰度。
上圖是H.264編碼,下圖是HEVC編碼。
五、色彩調(diào)優(yōu)
上面的幾種優(yōu)化方式都是在編碼層面調(diào)整參數(shù)或者直接改變編碼方式來提升視頻的畫質(zhì),但有一種方式通過調(diào)整視頻畫面的色值——綜合調(diào)整亮度、對比度、色溫、飽和度、銳度等顏色參數(shù),進而優(yōu)化整體的視頻畫面,讓視頻畫面看上去“更清晰”。
我們經(jīng)常用到的顏色空間有RGB顏色空間、HSV顏色空間、YUV顏色空間還有CIELab顏色空間,其中RGB顏色空間使用的比較廣泛。如上圖,圖像分為三個通道量:R分量、G分量、B分量,每個分量的值是0 ~ 255,三個分量共同組成一個顏色的RGB值。RGB分量的值分布構(gòu)成了顏色色值的直方圖,我們通過調(diào)節(jié)RGB值來調(diào)節(jié)圖像的顏色。
有幾種對顏色色值的調(diào)節(jié)方式,對我們理解顏色調(diào)節(jié)有很大的幫助:
- 亮度:亮度表示人眼對發(fā)光體或被照射物體表面的發(fā)光或反射光強度實際感受的物理量,簡而言之,RGB分量越大,圖像就越亮;反之,圖像越暗。
- 對比度:圖像對比度是指圖像中從黑色到白色漸變的層次反差或比值。反差越大,比值越大,從視覺上感知,圖像就越清晰醒目,對比度越大;反差越小,比值越小,從視覺上感知,圖像越不清晰醒目,蒙塵感越強,對比度越小。
- 色溫:色溫和溫度還真有一定的關(guān)系,表示絕對黑體從絕對零度開始加熱之后呈現(xiàn)的顏色。從我們生活中來看,暖色調(diào)看上去比較溫馨,冷色調(diào)感受上有點清涼。
- 飽和度:飽和度是指色彩的鮮艷程度或者純度。飽和度越高,圖像色彩越鮮艷,色彩純度越高;反之則越低,直至灰度圖。
- 銳度:銳度主要用來表示圖像邊緣的對比度,由于人類感官,高銳度的圖像看起來更加清晰,圖像上的細節(jié)對比非常明顯。
我們可以將上面五種調(diào)節(jié)方式綜合起來調(diào)節(jié)圖片色彩。
- 亮度增加10個點(-100 ~ 100)
- 色溫增加5個點(-100 ~ 100)
- 飽和度增加20個點(0 ~ 100)
- 銳度增加15個點(0 ~ 100)
第一張是原圖,第二張是經(jīng)過顏色調(diào)節(jié)之后輸出的圖片。
六、超分算法
上面提到的優(yōu)化方式無論從編碼層面,還是從顏色調(diào)節(jié)層面,都算是基本的優(yōu)化方式,近年來,隨著機器學(xué)習(xí)的火熱,超分算法越來越廣泛地應(yīng)用到圖像和視頻處理上來。超分辨率就是指通過機器學(xué)習(xí)地方式重建圖像,達成提升圖像分辨率的效果。
目前比較成熟的超分技術(shù)是Real-ESRGAN,基于BasicSR,采用ESRGAN算法,利用機器學(xué)習(xí)的優(yōu)勢對圖片和視頻進行去模糊、Resize、降噪、銳化等處理,重建圖片,實現(xiàn)對圖片的超分辨率處理。
E-SR-GAN算法的三個步驟:
- 特征提?。河嬎阍朦c
- 非線性映射:放大,模糊化噪點
- 圖像重建:差分,平滑過度,去噪
相對之前的SRCNN等超分算法,改進了如下幾點:
- 改進感知損失,提高輸出圖像的邊緣清晰度和紋理真實性。
- 利用對抗網(wǎng)絡(luò)的優(yōu)勢不斷反饋改進GAN判別器,預(yù)測高分辨率圖像和原始圖像之前的相對真實性而不是絕對真實性??梢曰謴?fù)原始圖像的真實的紋理細節(jié)。
- 優(yōu)化了模型的穩(wěn)定性,每次生成的圖片都和原圖片殘差對比,進行矯正訓(xùn)練,最終得到的結(jié)果非常穩(wěn)定。
下面是超分前后的對比結(jié)果:大家可以點擊大圖對比一下細節(jié),可以看出超分之后的圖片精細化很多,去掉模糊的地方、降低圖片的噪點。
七、總結(jié)
本文結(jié)合當(dāng)下視頻的痛點(清晰度問題),提出衡量視頻清晰度的標(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ǔ)上提出高級編碼方式(相對H.264編碼方式),再結(jié)合目前主流的視頻色彩濾鏡提出視頻色彩調(diào)優(yōu)方案,讓視頻看上去更清晰。最終的大殺器——超分算法采用E-SR-GAN方式進行放大、降噪、重建幀來提升視頻清晰度。希望上面這些方法可以給大家?guī)硪恍椭瑢μ嵘曨l清晰度有更進一步的思考。
參考文章:
VMAF開源項目 https://github.com/Netflix/vmaf
揭秘 VMAF 視頻質(zhì)量評測標(biāo)準(zhǔn)https://xie.infoq.cn/article/26aaf2ab83f56192a65ba22ea
Netflix VMAF 視頻質(zhì)量評估工具概述https://zhuanlan.zhihu.com/p/94223056
B幀對視頻清晰度/碼率的影響https://blog.csdn.net/matrix_laboratory/article/details/82726897
H264 vs H265https://www.cnblogs.com/wujianming-110117/p/12640533.html
超分開源項目https://github.com/xinntao/Real-ESRGAN