影片清晰度最佳化指南

得物技術發表於2022-11-23

一、背景介紹

隨著移動網際網路的深入發展,影片消費場景逐漸變成主流,早期由於手機硬體的限制問題,導致生產出來的影片畫質、清晰度存在較大的問題,使用者體驗不太好,當時的網路也處於4G的發展階段,網路的限制也無法持續支援高畫質影片的消費,但是現在5G發展地如火如荼,網路的高速發展,手機硬體效能的提升,使用者越來越不滿足於低畫質和低清晰度的影片。提升影片的畫質和清晰度勢在必行,需要一套行之有效提升影片清晰度的最佳化方案。

二、評價標準

做一件事情之前,首先需要確定一下評價這件事情的標準。所以在提出影片清晰度最佳化方案之前,必須先確定一下衡量影片清晰度的評價準則。評價影片清晰度有兩種準則:

2.1 客觀標準

客觀標準就是利用演算法計算影片畫面質量分,同等條件下,如果A影片的質量分得到高於B影片,說明A影片的保真質量做得比B影片更好。評估影片質量的演算法有兩大類:

  • 完全參考: 兩個影片逐幀對比分析,計算對比的質量,這種使用的比較多,常見的VMAF、PSNR、SSIM都是完全參考。
  • 部分參考: 截圖影片中的部分幀來對比分析。有些場景例如直播沒法完全對比,擷取部分幀來對比是比較科學的。

目前Netflix推出的VMAF演算法是評價影片質量的主流演算法,下面我們簡單介紹一下:

  • VMAF 全稱 Video Multi-method Assessment Fusion ,它藉助人類視覺模型以及機器學習來評估一個影片的質量。
  • VMAF的評價指標主要包含:其中VIF和DLM是空間域的,表示一幀畫面之內的特徵;TI是時間域的,表示多幀畫面之間的相關性特徵。

    • 影片資訊保真度(VIF:Visual Quality Fidelity)
    • 細節損失指標(DLM:Detail Loss Measure)
    • 時域運動指標/平均相關位置畫素差(TI:Temporal Information)
  • VMAF基於SVM的nuSvr演算法,在執行的過程中,根據事先訓練好的model,賦予每種影片特徵以不同的權重,對每一種畫面都生成一個評分,最終以均值演算法進行歸總,算出該影片的最終評分。
  • VMAF計算出的分數範圍是0 ~ 100,其中0表示最低質量,100表示最高質量,後續對比的時候只給出分數。

2.2 主觀標準

客觀標準固然重要,但是影片是給人看的,最終影片的質量好不好,還需要使用者主觀感受。換言之,兩個影片的VMAF可能相近,但是使用者觀感可能會不一樣,有些使用者喜歡柔色,有些使用者喜歡暖色。

主觀標準操作起來比較簡單,找幾個影片,讓使用者觀看之後主觀給出評價,影片A和影片B的質量對比如何,這種輸出的結果比較準確,但是工作量比較大,不好大範圍推廣。所以根據專案要求,在特定的時候採用客觀評價標準,在某些場景採用主觀評價標準。

例如下面兩張圖片,它們的VMAF值是相近的,但是第二張看上去明顯比第一張畫質好多了,而且更加明亮,這並沒有改變圖片的編碼結構,只是對畫面本身進行一些調色處理(這個我們下面會單獨拎出來講),就能明顯提升主觀感受。所以評價影片質量需要綜合主觀標準和客觀標準綜合來判斷。而且我們建議在有條件的情況下,主觀標準更加重要,因為客觀標準只是模擬人眼的視覺系統,和真實的場景還是有所差距。

三、基礎最佳化

透過上面的描述我們基本瞭解了影片質量的評價標準,但如果要提升影片質量,這些還不夠,我們還需要介紹一下影片的基本屬性,以及這些屬性可以在多大程度上影響影片的質量。
我們首先使用MediaInfo來檢視一下影片的屬性,由於重點關注畫質,所以就自動忽略封裝格式和音訊流資訊,只關注影片軌道資訊:

Video
ID                                       : 1
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : High@L3.1
Format settings                          : CABAC / 4 Ref Frames
Format settings, CABAC                   : Yes
Format settings, Reference frames        : 4 frames
Codec ID                                 : avc1
Codec ID/Info                            : Advanced Video Coding
Duration                                 : 2 min 41 s
Bit rate                                 : 634 kb/s
Bit rate mode                            : CBR
Width                                    : 960 pixels
Height                                   : 540 pixels
Display aspect ratio                     : 16:9
Frame rate mode                          : Constant
Frame rate                               : 25.000 FPS
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
Bits/(Pixel*Frame)                       : 0.049
Stream size                              : 12.2 MiB (94%)
Writing library                          : x264 core 148
Encoding settings                        : cabac=1 / ref=3 / deblock=1:0:0 / analyse=0x3:0x113 / me=hex / subme=7 / psy=1 / psy_rd=1.00:0.00 / mixed_ref=1 / me_range=16 / chroma_me=1 / trellis=1 / 8x8dct=1 / cqm=0 / deadzone=21,11 / fast_pskip=1 / chroma_qp_offset=-2 / threads=17 / lookahead_threads=2 / sliced_threads=0 / nr=0 / decimate=1 / interlaced=0 / bluray_compat=0 / constrained_intra=0 / bframes=3 / b_pyramid=2 / b_adapt=1 / b_bias=0 / direct=1 / weightb=1 / open_gop=0 / weightp=2 / keyint=75 / keyint_min=7 / scenecut=40 / intra_refresh=0 / rc_lookahead=40 / rc=crf / mbtree=1 / crf=26.0 / qcomp=0.60 / qpmin=0 / qpmax=69 / qpstep=4 / vbv_maxrate=800 / vbv_bufsize=1600 / crf_max=0.0 / nal_hrd=none / filler=0 / ip_ratio=1.40 / aq=1:1.00
Codec configuration box                  : av

其中有幾個非常重要的屬性需要特別關注一下:下面我們列出的各個屬性都是基於其他條件不變的情況下,只改變當前屬性。例如談Profile,就要保證其他的屬性是相同的,只有Profile不同,這樣比較影片的畫質才有意義。

3.1 Profile

Profile對應上面的是Encoder Profile Level,正常情況下,Profile Level有三種型別:

  • Baseline Profile
  • Main Profile
  • High Profile

其中Baseline Profile對應清晰度最低,Android 3.0之後的版本都支援的,Main Profile清晰度比Baseline Profile清晰度要好,但是從Android 7.0之後才支援,High Profile清晰度最高,也是從Android 7.0之後才支援。我們在設定Encoder Profile Level之前,需要判斷一下當前是否支援。

3.2 Bitrate位元速率

影片位元速率是影片資料傳輸時單位時間內傳送的資料位數。單位是kbps,望文生義,位元速率越大,單位時間填充的資料就越多,影片質量就越高。

位元速率並不是越大越好,位元速率設定超過一定的大小,對影片畫質的提升已不太明顯,肉眼已經看不出區別,但是影片大小會增加很多。所以設定合適的位元速率就行。通常建議的位元速率計算方式是:

Bitrate = width * height * frameRate * factor
factor = 0.15

按照上面的公式設定的位元速率是比較合適的,當然如果想要更加高畫質的,可以適當增加factor大小。

3.3 Bitrate Mode

位元速率雖然設定了,但是位元速率是描述一段時間的平均傳輸的資料位數,無法保證每一個時間段內傳送的資料大小是固定的或者在一個固定的範圍內。還有一個Bitrate Mode引數來表示位元速率模式。它也有三種型別:

  • VBR: 可變位元速率(Variable Bitrate), 此編碼方式會根據幀間資料的變化量大小來動態調整位元速率,如果幀間的運動變化比較大,調高位元速率,如果幀間的運動變化比較小,調小位元速率。從編碼方式就可以看出來,這樣的編碼方式有兩個缺點:(1)運動預測計算演算法有一定的耗時,編碼時間較長;(2)位元速率多變,最終生成的檔案大小不可預測。可能很大也可能很小。
  • CBR: 固定位元速率或者常數位元速率(Constant Bitrate), 這是預設的編碼方式,使用此編碼方式,檔案從始至終的編碼位元速率會固定不變或者基本不變。這種方式的好處是檔案大小是確定的,不會出現檔案大小不可預測的情況。但是缺點也很明顯,有時候幀間變化比較大,有時候幀間變化比較小,如果都使用同樣的位元速率,幀間變化比較大的時間畫質會比較一般,幀間變化比較小的時間顯得浪費。無法做到較好的平衡。
  • ABR: 平均位元速率(Average Bitrate), 平均位元速率較好地兼顧了VBR和CBR的,在幀間變化比較大的時間使用較大的位元速率,在幀間變化比較小的時間採用較小的位元速率,最終保證整體採用的位元速率固定就可以了。較好的處理了畫質和檔案大小之間的矛盾。

但是很可惜的是MediaCodec並不支援ABR,我們如果想採用ABR模式的話還需要使用軟編碼。MediaCodec也提供了三種模式:

  • BITRATE_MODE_CQ: 這種模式是全面考慮影片質量,儘可能保證影片質量,所以編碼出來的影片都很大,並不可取。
  • BITRATE_MODE_VBR: 同上面的VBR
  • BITRATE_MODE_CBR: 同上面的CBR

眾所周知,硬編碼速度要遠遠快於軟編碼,所以編碼都是優先採用硬編碼,硬編碼失敗再採用軟編碼相容。所以硬編碼MediaCodec建議採用BITRATE_MODE_CBR模式,切換到軟編碼採用VBR模式。

3.4 B幀設定

影片由I幀、P幀、B幀 三種型別的影片幀組成的。

I幀是幀內影像幀,就是關鍵幀,意思是此幀不需要依賴其他的幀就可以進行編碼或者解碼。

P幀是前向預測影像幀,此幀需要參考在它之前的I幀或者P幀,採用運動預測的方式進行幀間編碼或者解碼。P幀大小相當於I幀大小的1/10 ~ 1/20。

B幀是雙向預測影像幀,此幀需要參考在它之前的I幀或者P幀,也需要參考在它之後的I幀或者P幀,採用運動預測的方式進行幀間預測編碼或者解碼。

GOP表示兩個I幀之間的影像幀序列,GOP=2s,表示兩個I幀之間的間隔是2s。

Android平臺只有高通部分晶片支援B幀編碼,並且Android系統也沒有開發設定B幀的介面,所以對使用Android MediaCodec編碼的開發者而言,無法開啟B幀編碼(iOS是可以的,暗自垂淚)。當然軟編碼是可以設定B幀的。

設定B幀有什麼好處?

B幀大小約是I幀大小的1/50,如果設定了B幀了,並不會降低清晰度,但是可以大大降低影片的大小,這樣我們就可以相應地調大位元速率,最終實現了提升清晰度的目標。
當然設定了B幀之後,增加了編碼和解碼的複雜度,這點開發者在設定的時候必須要有充分的認識。

四、HEVC編碼

目前H.264編碼還是使用最廣泛的編碼方式,主要還是H.264編碼的相容性比較好,而且免費開源。HEVC自從2013年第一版釋出開源出來,還沒有完全替代H.264(主要原因是收費,而且部分機型可能不支援),不過HEVC憑藉其獨特的優勢也得到了較多地應用。

HEVC相對H.264的優勢:

  • HEVC標準影片的幀內預測模式支援33種方向,並且提供了更好的運動補償處理和向量預測方法。而H.264只支援8種。
  • HEVC採用了塊的四叉樹劃分結構,採用了8x8 ~ 64 x 64 畫素的自適應塊劃分,而H.264每個宏塊的大小都是固定的16 x 16畫素,HEVC的這樣設計可以保證在不同的幀間和幀內複雜程度中可以動態調整宏塊的大小,經過測試發現,在相同的影像質量下,HEVC編碼的影片比H.264編碼的影片約減少40%,換言之,如果HEVC和H.264位元速率相同,那麼HEVC編碼的影片比H.264編碼的影片要清晰地多。

上圖可以看出同樣的影片幀,HEVC使用的宏塊比H.264要少很多,體現了HEVC的優勢。

解析度H.264/AVCH.265/HEVC
480p1.5 Mbps0.75 Mbps
720p3 Mbps1.5 Mbps
1080p6 Mbps3 Mbps
4k32 Mbps15 Mbps

我們在使用MediaCodec HEVC硬編碼時,需要判斷一下當前是否支援HEVC編碼,Android 5.0已經支援了HEVC,不過一些低端晶片可能還是沒有支援HEVC,我們在編碼之前需要判斷一下是否支援。

使用HEVC編碼,可以保證在不增加檔案大小的情況下,大大提升影片的清晰度。

上圖是H.264編碼,下圖是HEVC編碼。

五、色彩調優

上面的幾種最佳化方式都是在編碼層面調整引數或者直接改變編碼方式來提升影片的畫質,但有一種方式透過調整影片畫面的色值——綜合調整亮度、對比度、色溫、飽和度、銳度等顏色引數,進而最佳化整體的影片畫面,讓影片畫面看上去“更清晰”。

我們經常用到的顏色空間有RGB顏色空間、HSV顏色空間、YUV顏色空間還有CIELab顏色空間,其中RGB顏色空間使用的比較廣泛。如上圖,影像分為三個通道量:R分量、G分量、B分量,每個分量的值是0 ~ 255,三個分量共同組成一個顏色的RGB值。RGB分量的值分佈構成了顏色色值的直方圖,我們透過調節RGB值來調節影像的顏色。

有幾種對顏色色值的調節方式,對我們理解顏色調節有很大的幫助:

  • 亮度: 亮度表示人眼對發光體或被照射物體表面的發光或反射光強度實際感受的物理量,簡而言之,RGB分量越大,影像就越亮;反之,影像越暗。
  • 對比度: 影像對比度是指影像中從黑色到白色漸變的層次反差或比值。反差越大,比值越大,從視覺上感知,影像就越清晰醒目,對比度越大;反差越小,比值越小,從視覺上感知,影像越不清晰醒目,蒙塵感越強,對比度越小。
  • 色溫: 色溫和溫度還真有一定的關係,表示絕對黑體從絕對零度開始加熱之後呈現的顏色。從我們生活中來看,暖色調看上去比較溫馨,冷色調感受上有點清涼。
  • 飽和度: 飽和度是指色彩的鮮豔程度或者純度。飽和度越高,影像色彩越鮮豔,色彩純度越高;反之則越低,直至灰度圖。
  • 銳度: 銳度主要用來表示影像邊緣的對比度,由於人類感官,高銳度的影像看起來更加清晰,影像上的細節對比非常明顯。

我們可以將上面五種調節方式綜合起來調節圖片色彩。

  • 亮度增加10個點(-100 ~ 100)
  • 色溫增加5個點(-100 ~ 100)
  • 飽和度增加20個點(0 ~ 100)
  • 銳度增加15個點(0 ~ 100)

第一張是原圖,第二張是經過顏色調節之後輸出的圖片。

六、超分演算法

上面提到的最佳化方式無論從編碼層面,還是從顏色調節層面,都算是基本的最佳化方式,近年來,隨著機器學習的火熱,超分演算法越來越廣泛地應用到影像和影片處理上來。超解析度就是指透過機器學習地方式重建影像,達成提升影像解析度的效果。

目前比較成熟的超分技術是Real-ESRGAN,基於BasicSR,採用ESRGAN演算法,利用機器學習的優勢對圖片和影片進行去模糊、Resize、降噪、銳化等處理,重建圖片,實現對圖片的超解析度處理。

E-SR-GAN演算法的三個步驟:

  • 特徵提取:計算噪點
  • 非線性對映:放大,模糊化噪點
  • 影像重建:差分,平滑過度,去噪

相對之前的SRCNN等超分演算法,改進了如下幾點:

  • 改進感知損失,提高輸出影像的邊緣清晰度和紋理真實性。
  • 利用對抗網路的優勢不斷反饋改進GAN判別器,預測高解析度影像和原始影像之前的相對真實性而不是絕對真實性。可以恢復原始影像的真實的紋理細節。
  • 最佳化了模型的穩定性,每次生成的圖片都和原圖片殘差對比,進行矯正訓練,最終得到的結果非常穩定。

640-90.png

下面是超分前後的對比結果:大家可以點選大圖對比一下細節,可以看出超分之後的圖片精細化很多,去掉模糊的地方、降低圖片的噪點。

七、總結

本文結合當下影片的痛點(清晰度問題),提出衡量影片清晰度的標準——主觀標準和客觀標準,指明瞭影片清晰度的最佳化目標和方向,根據影片的基本特徵(位元速率、GOP、編碼模式等)提出基礎最佳化的方法,在基礎最佳化的基礎上提出高階編碼方式(相對H.264編碼方式),再結合目前主流的影片色彩濾鏡提出影片色彩調優方案,讓影片看上去更清晰。最終的大殺器——超分演算法採用E-SR-GAN方式進行放大、降噪、重建幀來提升影片清晰度。希望上面這些方法可以給大家帶來一些幫助,對提升影片清晰度有更進一步的思考。

參考文章:

*文 /Jeff Mony
關注得物技術,每週一三五晚18:30更新技術乾貨
要是覺得文章對你有幫助的話,歡迎評論轉發點贊~

相關文章