您當前的位置:首頁 > 文化

x264和x265編碼器位元速率控制之基本模型

作者:由 只是學電的 發表于 文化時間:2022-01-21

再來談談x264和x265的位元速率控制吧。因為它兩的位元速率控制程式碼是一脈相承,原理基本沒差,所以放到一起來說。

最近在我們的交流群裡,也有小夥伴提問過一個問題,

x264和x265中的位元速率控制為什麼不用HM中的lambda domain,而是採用複雜度計算qp呢?

大家也可以思考一下這個問題。我個人看法是這樣的(不一定對):

x264和x265編碼器位元速率控制之基本模型

​影片編碼器裡面的位元速率控制模組,從功能上來說,就是負責給編碼器實際編碼時(量化模組),提供合適的量化引數QP值。

x264和x265編碼器位元速率控制之基本模型

​我們知道,像H。264和H。265這些影片編碼標準裡面,量化引數QP的取值範圍是確定的,亮度分量取0-51。對於某一幀甚至某個宏塊,到底是用高QP編碼效能好,還是用低QP編碼好,這個策略需要位元速率控制模組來做。

我們知道,QP引數會用於量化模組,它會引起影片影象的失真,它也直接決定著殘差資料的大小,即很大程度影響最終編碼後碼流的大小。既然QP既要影響影象失真,又會影響碼流大小,而選擇最佳QP是個最佳化過程,這不就是影片編碼裡面的率失真最佳化RDO理論嘛。

位元速率控制過程涉及到RDO,那勢必存在一個R-D模型。如果你知道某人在搞位元速率控制的研究,不妨先問問他,所用的R-D模型,或者R-QP模型是什麼?

那x264和x265的R-D模型是什麼呢?請看下式:

x264和x265編碼器位元速率控制之基本模型

​這裡的R表示目標位元速率(位元數),X是當前的畫面幀複雜度,α是碼控引數。上式意味著,當前幀的複雜度越大時,qscale就越大,幀級QP就相對越小。

大家想想這裡qscale實際表示的是什麼,透過它和QP的關係式形式來看,其實它就是拉格朗日乘子λ。x264原始碼裡是這樣說的:

x264和x265編碼器位元速率控制之基本模型

​那x264和x265裡面要計算出一個幀級的QP,需要知道哪些資訊呢?請看下式:

x264和x265編碼器位元速率控制之基本模型

上式中下標n表示當前幀號,取值從0開始。當前幀的複雜度用SATD cost來表徵,其值實際上不僅僅是當前幀的SATD,還包括先前已編碼幀的SATD加權。comp是考慮人眼視覺特性對SATD的非線性對映,預設取0。6,CBR時取0。

上面計算QP式中分母部分,編碼器配置引數目標位元速率和幀率用於計算期望每幀位元數,隨著編碼幀數增大不斷累加。而分子部分的右邊一項下標是i-1,表示它需要前一幀的編碼資訊,包括前一幀的實際bit數,實際qscale,實際rceq。

但對於編碼的第一幀(而且是IDR幀)來說,因為它沒有前一幀資訊,所以,對於前面計算QP的公式,需要考慮其邊界值,n=0的情況。也就是每個位元速率控制演算法裡面,都需要加以考慮的“首幀QP問題”。

在x264的x264_ratecontrol_new函式中,對於首幀QP的計算給定了一些初值。

x264和x265編碼器位元速率控制之基本模型

​這裡的rc->cplxr_sum對應的就是計算當前幀QP中公式中的箭頭所指項。

x264和x265編碼器位元速率控制之基本模型

​顯然x264裡面給的這個cplxr_sum初始值是一個和宏塊個數,即與影象解析度大小相關的經驗值。而這裡的rc->wanted_bit_window對應的就是上式分母中右邊的值。

而至於幀級QP計算公式中的那些SATD cost值,它實際上是在位元速率控制模組之前的預處理模組中計算的。它的值獲取需要進行預測編碼過程,即I幀需要基於影象塊決策其最佳預測方向,P幀需基於影象塊劃分決策其最佳MV(是的需要做運動估計),得到整幀裡所有塊的SATD cost和。

好在預處理模組不需要進行模式選擇和子塊分割,所以我們可以直接指定好計算SATD時分割塊的大小。考慮到碼控需要整幀複雜度,所以要對整幀所有影象塊都做一次預測,複雜度比較高,目前x264和x265裡面都是用原始影象寬和高都做1/2降取樣後的影象去計算SATD。

原始影象時塊搜尋大小通常以16x16為單元,在寬和高降取樣以後,那就是以8x8塊為單元。雖然這裡降了解析度,減少了一些計算複雜度,但是和H。265的參考軟體HM的R-lambda碼控模型和演算法相比,x264和x265的位元速率控制計算複雜度還是很高。畢竟還是要基於預測去做每幀的SATD cost計算。

總結

介紹了x264和x265裡面幀級位元速率控制模型以及每幀QP計算公式。分析了為什麼它們的位元速率控制模組計算複雜度高。

既然他們計算幀複雜度SATD cost需要基於預測過程,有些問題就不得不面對:

1。 此處的SATD cost究竟是誰和誰的SATD?是原始畫素和預測畫素嗎?

2。預測時參考幀用的哪裡的,如何管理的?

3。預測時的降取樣的影象,是如何降取樣的?

4。 I幀預測時所有角度方向是否都做?

5。 P幀預測時,ME的整畫素搜尋演算法和模式決策時是否一樣,是否進行亞畫素搜尋?

6。P幀做ME搜尋前,搜尋起始點的MVP構建是否和標準一致?

標簽: qp  位元速率  SATD  x264  複雜度