"rate control" 用來決定影片檔案中每個圖框要花多少時間處理。

理想的影像編碼器:檔案儘可能小、品質儘可能高。"rate control" 即為控制平衡的關鍵要素

VBR vs CBR

可變速率(Variable Bitrate, VBR) vs 等速率(Constant Bitrate, CBR)

VBR: 在不易壓縮的部分(例如影像畫面複雜或快速變動)使用較高的位元率。

encoding scenario

依使用目的選用編碼方式:

  1. 檔案儲存
  2. 串流
  3. 實況
  4. 特定設備

Rate Control Modes 介紹

Constant QP(CQP) 等量化參數

CQP 控制每個圖框中區塊的壓縮程度,數值越高,壓縮率越高,畫值也降低。

H.264 中,QP 範圍從 051,例如:

ffmpeg -i <input> -c:v libx264 -qp 23 <output>

設定固定 QP,會導致位元率隨場景複雜度變動,且無法控制實際輸出之位元率,故實際上很少使用此方式。

Average Bitrate(ABR)

平均位元率

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

指定一期望位元率,然而實際狀況是編碼器並無法預知影片接下來的時間的畫面內容,只能用猜測的方式推定如何達到此位元率,導致影片前段品質變化很大,不建議使用。

Constant Bitrate(CBR)

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 參數,強制編碼器使用一定的位元率。輸出格式為 .ts,因為 mp4 不支援 NAL 填充。此方式確保整段影片維持一定的位元速率與品質,但對於網路頻寬使用效率較差。

2-Pass Average Bitrate(2-Pass ABR)

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

進行 2-pass 的最主要用途在進行 first-pass 時可計算每個 frame 編碼成本,以便在 second-pass 時最佳化。

此方式是用來編碼串流檔案的最簡單方式。(可參考 youtube 的 建議)

Constant Quality(CQ)/Constant Rate Factor(CRF)

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

CRF 範圍從 051(與 QP 相同),數值越大,壓縮率越高。23 是個良好的預設值,18 以下只徒增檔案大小,視覺上已無差異。數值每增減 6 ,位元率將加倍或減半。

CRF : 方式為指定品質,無法控制檔案大小。

2-Pass : 可控制想要的檔案大小。

這兩種編碼方式若有相同的位元率,則品質也相同。

Constrained Encoding (VBV)

VBV(Video Buffering Verifier) 提供約束位元率的最大值,有利於串流,

結論:

  1. 檔案儲存: 使用 CRF 設定想要的品質。
  2. 串流: 使用 2-passVBV-constained bitrate VBR
  3. 實況: 使用 1-pass CRF 或 VBV-constained bitrate VBR。
  4. 設備: 使用 2-pass ABR。