影片編碼速率控制
"rate control" 用來決定影片檔案中每個圖框要花多少時間處理。
理想的影像編碼器:檔案儘可能小、品質儘可能高。"rate control" 即為控制平衡的關鍵要素
VBR vs CBR
可變速率(Variable Bitrate, VBR) vs 等速率(Constant Bitrate, CBR)
VBR: 在不易壓縮的部分(例如影像畫面複雜或快速變動)使用較高的位元率。
encoding scenario
依使用目的選用編碼方式:
- 檔案儲存
- 串流
- 實況
- 特定設備
Rate Control Modes 介紹
Constant QP(CQP) 等量化參數
CQP 控制每個圖框中區塊的壓縮程度,數值越高,壓縮率越高,畫值也降低。
在 H.264
中,QP 範圍從 0
到 51
,例如:
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
範圍從 0
到 51
(與 QP
相同),數值越大,壓縮率越高。23
是個良好的預設值,18
以下只徒增檔案大小,視覺上已無差異。數值每增減 6
,位元率將加倍或減半。
CRF
: 方式為指定品質,無法控制檔案大小。
2-Pass
: 可控制想要的檔案大小。
這兩種編碼方式若有相同的位元率,則品質也相同。
Constrained Encoding (VBV)
VBV(Video Buffering Verifier) 提供約束位元率的最大值,有利於串流,
結論:
- 檔案儲存: 使用
CRF
設定想要的品質。 - 串流: 使用
2-pass
或VBV-constained bitrate
VBR - 實況: 使用
1-pass
CRF 或VBV-constained bitrate
VBR。 - 設備: 使用
2-pass
ABR。