視訊編碼中的位元速率控制模式

語言: CN / TW / HK

數字視訊在處理、儲存和傳輸上需要大量資料,典型的 30FPS 的高清視訊(1920x1080),如果每個畫素需要 8bit 來表示的話,那麼每秒需要大約 15億 bit。而視訊編碼技術的目標就是獲取位元速率和視覺質量之間的權衡。

1920 x 1080 x 8 x 3 x 30 = 1,492,992,000

在視訊編碼技術中,位元速率控制(Rate Control)是一件非常重要的事情。在編碼視訊幀時,位元速率控制決定了編碼器為該視訊幀分配的 bit 數。

本文將基於 FFMpeg 中的 X264、X265 編碼器來介紹常用的位元速率控制模式。

CQP(Constant Quantization Parameter)

QP(Quantization Parameter) 用於控制每幀視訊中每一個巨集塊的壓縮量。實際上,QP 反映了空間細節壓縮情況。QP 越小,就會保留越多的細節資訊,視訊質量也會越高,同時位元速率越大。QP 越大,細節資訊丟失的越多,位元速率也會隨之降低,但影象失真也會越嚴重。也就是說,QP 和位元速率成反比,QP 越大,位元速率越低;QP 越小,位元速率越高。

在 H.264/H.265 中,QP 的取值範圍為 [ 0 , 51 ] [0, 51] 。利用 FFMpeg,我們可以非常方便的為整個編碼(轉碼)過程設定一個固定的 QP。

ffmpeg -i <input> -c:v libx264 -qp 23 <output>
ffmpeg -i <input> -c:v libx265 -x265-params qp=23 <output>

謹慎使用 CQP

除非我們知道自己在做什麼,否則永遠不要使用 CQP 來進行位元速率控制。為整個編碼過程設定一個固定的 QP 意味著:最終的視訊位元速率會因為場景的複雜性而發生巨大變化。如果設定的 QP 足夠低,那麼編碼的視訊質量會非常好,但與 CRF 相比,這無疑會產生位元速率的浪費。

CQP 比較適合用於視訊編碼器的研究,比如在 RD 曲線中,我們會採用不同的 QP 來產生對應的編碼視訊,進而對編碼器進行對比。

QP 與 率失真曲線

在評估不同編碼器時,我們會用到率失真( R D RD )曲線。一般而言, R D RD 曲線都是以位元速率( Kbps )做為橫座標,以 P S N R ( d B ) PSNR(dB) 作為縱座標做出來一條曲線。對於 R D RD 曲線上的點,我們一般採用的是 Q P = 28 , 32 , 36 , 40 QP=28, 32, 36, 40 這四個 QP 下的編碼位元速率和編碼質量。

ABR(Average Bitrate)

ABR 又稱為目標位元速率(target bitrate)。ABR 會為編碼器設定一個目標位元速率,然後讓編碼器來計算如何才能達到我們設定的目標位元速率。

我們可以利用如下的命令將目標位元速率設定為 1Mbs。

ffmpeg -i <input> -c:v libx264 -b:v 1M <output>
ffmpeg -i <input> -c:v libx265 -b:v 1M <output>

避免使用 ABR

一位 x264 的主要開發人員說:永遠不要使用 ABR 來控制視訊的位元速率。為什麼這麼說呢?這主要是因為,編碼器無法確切的知道接下來需要編碼的視訊幀的情況,因此編碼器不得不通過猜測來確定如何才能達到我們設定的目標位元速率。這也意味著,ABR 在控制碼率時,位元速率的波動範圍相對較大,尤其是在視訊的開頭或者達到目標位元速率的地方。尤其是對於 HAS(HTTP Adaptive Streaming) 流媒體而言,ABR 會導致分片內的視訊質量產生較大的變化。

ABR 並不是一種固定位元速率控制模式。儘管 ABR 也是一種 VBR 模式,但是 因為 ABR 並無法可靠的提供良好的編碼質量,因此,ABR 也並不比 CBR 好多少。

CBR(Constant Bitrate)

如果我們需要強制編碼器總是使用某個固定的位元速率來編碼視訊,我們可以使用 CBR。對於 x264,可以通過 nal-hrd 來設定 CBR 和 VBR 模式。

ffmpeg -i <input> -c:v libx264 -x264-params "nal-hrd=cbr:force-cfr=1" \
-b:v 1M -minrate 1M -maxrate 1M -bufsize 2M <output>

nal-hrd

nal-hrd

Default: None

Signal HRD information. Required for Blu-ray streams, television broadcast and a few other specialist areas. Acceptable values are:

  • none: Specify no HRD information
  • vbr: Specify HRD information
  • cbr: Specify HRD information and pack the bitstream to the bitrate specified by bitrate. Requires bitrate mode ratecontrol.

Recommendation: none, unless you need to signal this information.

CRF(Constant Rate Factor)

CRF 是 x264 和 x265 編碼器的預設質量/位元速率控制設定。CRF 的取值範圍為 [ 0 , 51 ] [0,51] ,數值越低,質量越好,檔案越大。對於不同的編碼器,CRF的預設值如下:

  • x264:23
  • x265:28

當CRF 取值為 18(x264)、24(x265) 時,其編碼質量在視覺上被認為是無感知的,更小的取值往往意味著位元速率的浪費。

CRF 的值每 ± 6 \pm 6 ,對應的編碼檔案的大小就會增加1倍或減半。

ffmpeg -i <input> -c:v libx264 -crf 23 <output>
ffmpeg -i <input> -c:v libx265 -crf 28 <output>

CRF & 2-Pass

具有相同位元速率的 2-Pass 和 CRF 編碼在質量上應該相同。二者的主要區別在於:

  • 使用 2-Pass 編碼時,可以控制檔案大小
  • 使用 CRF 時,只需指定所需的視訊質量

2-Pass ABR(2-Pass Average Bitrate)

當採用 2-Pass 編碼的時候,對於視訊流中的所有資料,編碼器會對其處理兩次。在第一遍處理的時候,編碼器會收集視訊的相關資訊,在第二次處理時,編碼器利用第一次處理收集到的資訊來優化編碼過程。

在 CBR 模式下,2-Pass 編碼比 1-Pass 編碼的效率更高。2-Pass 編碼比 1-Pass 編碼的質量要高,但是編碼時間也會隨之增加。使用 2-Pass 編碼時,對於場景變化不大的畫面(如靜態畫面),分配的位元速率會低一些;而場景變化大的畫面(如賽車、運動等),分配的位元速率會高一些。因此, 2-Pass 編碼可以讓整部影片的清晰度比較均勻。

x264 編碼器的 2-Pass 編碼命令如下:

ffmpeg -i <input> -c:v libx264 -b:v 1M -pass 1 -f null /dev/null
ffmpeg -i <input> -c:v libx264 -b:v 1M -pass 2 <output>.mp4

x265 編碼器的 2-Pass 編碼命令如下:

ffmpeg -i <input> -c:v libx265 -b:v 1M -x265-params pass=1 -f null /dev/null
ffmpeg -i <input> -c:v libx265 -b:v 1M -x265-params pass=2 <output>.mp4

直播場景

2-Pass 編碼不可用於直播場景。

參考文獻