FFmpeg H.264 編碼器

· ☕ 3 分鐘

H264

H.264 / MPEG-4 AVC 是目前最被廣泛被應用的視訊編碼格式,它的壓縮效率比 MPEG-2、MPEG-4、RV40 …等舊視訊編碼格式還要高許多。

如果要輸出 H.264 / AVC 視訊編碼,則需要 libx264 編碼器,FFmpeg 的組態設定之中必須有 --enable-libx264 則才可以使用。

H.264 有多個版本,版本越高壓縮比就越高(對應到 profile)

碼率控制(Rate control)

Rate control 是指控制 每個畫格用了多少個位元 的方法,這將影響檔案大小和品質分布。這裡就先不探討 Rate control 的種類有哪些。
通常會用下列兩種模式: Constant Rate Factor (CRF)、Two-Pass ABR,若沒有控制輸出大小的需求則使用 CRF 即可

Constant Rate Factor(CRF)

固定品質指標,而不在意大小;CRF 會得到最佳的 bitrate 分配結果,缺點是你不能直接指定一個目標 bitrate 或是檔案大小。
設定值範圍為 0 – 51(可能會依照編譯版本而不同),0 為最高品質,預設值為 23,建議的範圍在 18 - 28,17 或 18 接近視覺無損,但在技術上來說並不是無損。

Two-Pass ABR(Average Bitrate)

以平均值來說 ABR 與 CBR 相同,但 ABR 允許在 “適當” 的時候使用更好的 bitrate 以取得更好的畫質,但 ABR 是用動態補償的方式來計算畫面的複雜度,也就是說在影片的起始及開頭,或是當畫面不如預期變化的時候則可能會影響到產出。
所以在 two-pass 的時候,第一次轉檔時會先分析紀錄影片的內容,第二次再依照分析的結果加以轉碼,但相對的就是非常耗時,要是沒有輸出大小的需求,則用 CRF 即可。

Preset

為選項集合,用來設定編碼速度,相對的也會影響到壓縮比;編碼越快則壓縮比越低。
一速度遞減排序為:ultrafastsuperfastveryfastfasterfastmedium(預設)、slowslowerveryslowplacebo

Tune 選項

也是為一個集合選項,可針對特定的影片類型微調參數設定值,以獲得更好的品質或壓縮率

  • Film:film,用於高解析度電影,降低 deblocking
  • Animation:animation,動畫&卡通,使用 deblocking 和較多的 reference frames
  • Grain:grain,保留舊影片的顆粒感
  • Still Image:stillimage,幻燈片效果的影片
  • Fast Decode:fastdecode,啟用部分禁用的 filter 來加速編碼
  • Zero Latency:zerolatency,快速編碼&低延遲
  • PSNR:psnr,優化 PSNR
  • SSIM:ssim,優化 SSIM

Profile

複合選項,Profile 越好壓縮比也越高,但編碼複雜度相對提升;越好的 Profile 相對啟用的功能也越多,所以對播放硬體的需求也較高

Profiles
baseline main high
no-8x8dct 1 1
bframes 0
no-cabac 1
cqm flat flat
weightp 0

Level

複合選項,與解碼器的效能及容量對應,Level 越高需求越高

Level
MaxMBPS(MB/s) MaxFS(MBs) MaxDpbMbs(MBs) MaxBR(kbit/s)(Baseline,Main Profiles) Examples for high resolution@ highest frame rate
3.0 40,500 1,620 8,1000 10,000 176×144@172 352×240@120 352×480@60 720×480@30 720×576@25
3.1 108,000 2,600 18,000 14,000 352x288@172 352x576@130 640x480@90 720×576@60 1,280×720@30
4.0 245,760 8,192 32.768 20,000 720x480@172 720x576@150 1,280×720@60 2,048×1,024@30
4.1 245,760 8,192 32,768 50,000 720x480@172 720x576@150 1,280×720@60 2,048×1,024@30
4.2 522,240 8,704 34,816 50,000 720x576@172 1,280×720@140 2,048×1,080@60

Decoded picture buffering

1
capacity = min(floor(MaxDpbMbs / (PicWidthInMbs * FrameHeightInMbs)), 16)
Level 3.0 3.1 4.0 4.1 4.2
MaxDpbMbs 8,100 18,000 32,768 32,768 34,816

自定義

以上說的都是複合指令,若是有需求也可利用 -x264-params 做個別設定

可參考:
https://ffmpeg.org/ffmpeg-codecs.html#libx264_002c-libx264rgb

  • -I, keyint
    設定 i-frame 間隔,也就是 GOP size

  • -i, --min-keyint
    最小 GOP size

  • -r, --ref
    控制 DPB(Decoded Picture Buffer) 大小,表示 P-frame 參照多少個 frame。預設值為 3,範圍:0 - 16。

  • --scenecut
    配置動態 i-frame 的參考值;x264 的 frame 中會紀錄與參考 frame 的差異,當判斷差異過大時就是場景變更,此時就會插入一個 i-frame 來做紀錄,差異的依據可由設定 scenecut 來做判別,當設為 0 時等同 no-scenecut。

  • --no-scenecut
    停用 adaptive I-frame decision

參數優先順序

1
preset -> tune -> "custom" -> profile -> level

Tony
作者
Tony
Software Engineer