VP9 HDR 編碼

高動態範圍 (HDR) 影片技術日趨成熟,目前有許多標準正逐步趨於一致。

如要瞭解 HDR 影片的發展歷程,請參閱維基百科文章「高動態範圍影片」。

FFmpeg 可與 VP9 搭配使用,將 HDR 來源壓縮為標準動態範圍 (SDR) 輸出內容,或將 HDR 來源重新封裝為適合在網路上播放的 HDR 格式。

輸入來源

目前,使用 VP9 編碼 HDR 時,任何 FFmpeg 支援的高位元深度 (10 位元) 編碼器都可以做為輸入內容 (例如 VP9 Profile 2 和 3、H.264 (10 位元)、DNxHR、HEVC、ProRes 等)。另請參閱 YouTube 支援文章「上傳高動態範圍 (HDR) 影片」。

編碼輸出內容觸及人數:

目前一般來說,支援的目標裝置包括任何可解碼 VP9 Profile 2 並輸出至 HDR 螢幕的裝置。

  • Chromecast Ultra + 支援 HDR 的電視
  • 在 Windows 10 Fall Creators Update 上使用 Chrome 64 Canary,並開啟 HDR 旗標。(這是很實用的偵錯工具)。
  • 支援 VP9 Profile 2 的 HDR 電視
    • 所有 Samsung 2017 年 HDR 型號 (flatpanelshd.com 清單) 和 2016 年以「KS」開頭的型號
    • 所有 LG 2017 年 HDR 機型 (以及部分 2016 年 LG G6 機型)
    • 在行動裝置上,支援硬體加速 VP9 Profile 2 10 位元 HDR 解碼 (魅族 Pro 7)
    • 2017 年的 UHD 藍光

啟用 VP9 Profile 2 和 HDR EOTF 的 FFmpeg 指令列設定

FFmpeg 必須建構為支援 10 位元 (或甚至 12 位元)。

在以下範例中,我們使用靜態建構的 ffmpeg,支援 10 位元。 你可以使用我們的建構指令碼自行建立,或按照 FFmpeg 網站上的指引操作。

以下是可用的 FFmpeg 指令列,可將 HDR 編碼為 SMPTE 2084 (PQ EOTF) 標準,並使用 VP9:

ffmpeg -i strobe_scientist_18Mbps.webm -b:v 18000000 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 -profile:v 2 -vcodec libvpx-vp9 /dev/null && \
   ffmpeg -i strobe_scientist_18Mbps.webm -b:v 18000000 -pass 2 \
   -pix_fmt yuv420p10le \
   -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
   -maxrate 26800000 -minrate 8040000 -profile:v 2 -vcodec libvpx-vp9 \
   strobe_scientist_18Mbps.webm

以下是這裡介紹的重要參數:

ffmpeg 支援 10 位元的靜態建構版本
-pass 1 HDR 必須使用 2-pass 編碼。在本例中,第一遍會輸出至 /dev/null,並在第二遍時於記憶體中處理。
-pix_fmt yuv420p10le 設定 YUV 4:2:0 10 位元像素格式
-color_primaries 9 設定 BT2020 詳情請參閱本文件第 5 頁和第 6 頁。
-color_trc 16 16 將轉移特性設為 SMPTE 2084。PQ 18 將傳輸特性設為 SMPTE 2086 HLG
-colorspace 9 colorspace 是「matrix_coefficients」。這項設定應與內容的母帶處理方式一致。(例如 bt709、bt2020_ncl)。在本例中,bt2020_ncl 應為 9。如需進一步參考,請參閱本文件第 12 頁
-color_range 1 色彩範圍 (0 = 未指定、1 = mpeg/studio/tv、2 = jpeg/full/pc)
-profile:v 2 如要使用 HDR,必須提供設定檔或 23
-vcodec libvpx-vp9 使用 VP9 編碼器。

編碼範例

下列範例均使用來源檔案 strobe_scientist.mkv

一般而言,使用 HDR 編碼時,建議位元率比同等的 8 位元 SDR 編碼高出 25% 至 30%。這些範例通常以 18 Mbps 為目標。經過最佳調整後,12 Mbps 的位元率即可產生良好的 HDR 效果。

編碼作業是在 Ubuntu Linux 系統上執行,規格如下:

  • 處理器:4x Intel(R) Core(TM) i5-6500 CPU @ 3.20GHz
  • 記憶體 (RAM):8060MB (已使用 1492MB)
  • 顯示卡:Intel HD Graphics 530 (Skylake GT2)
  • 作業系統:Ubuntu 16.04 LTS

轉換為 YUV 4:2:0 10 位元 PQ

範例 A:6 Mbps 4K 2-pass
ffmpeg -y -report -i strobe_scientist.mkv -b:v 6000000 -speed 4 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 8000000 -minrate 4000000 \
  -profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -y -report -i strobe_scientist.mkv -b:v 6000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 8000000 -minrate 4000000 \
  -profile:v 2 -vcodec libvpx-vp9 \
  2pass_HDR_strobe_scientist_6Mbps-static.webm
範例 B1:18 Mbps 4k 2-pass
ffmpeg -y -report -i strobe_scientist.mkv -b:v **18000000** -speed 4 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate **20800000** -minrate **15040000** \
  -profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate **20800000** -minrate **15040000** \
  -profile:v 2 -vcodec libvpx-vp9 \
  2pass_HDR_strobe_scientist_18Mbps-static.webm
範例 B2:18 Mbps 1080p 2-pass
ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -speed 4 -pass 1 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 20800000 -minrate 15040000 \
  -profile:v 2 **-vf ****scale=-1:1080**** **-vcodec libvpx-vp9 \
  -f webm /dev/null && \
  ffmpeg -y -report -i strobe_scientist.mkv -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 16 -colorspace 9 -color_range 1 \
  -maxrate 20800000 -minrate 15040000 \
  -profile:v 2 **-vf ****scale=-1:1080**** **-vcodec libvpx-vp9 \
  1080_2pass_HDR_strobe_scientist_18Mbps-static.webm

使用尋找表 (LUT) 將 HDR 轉換為 SDR

如要將 HDR 轉換為 SDR,轉碼器必須瞭解如何將亮度層級和色彩對應至較小的 BT.709 色域和非 HDR 亮度範圍。為獲得最佳結果,可以使用 LUT 說明如何執行對應 (通常是內容專屬)。範例 C 和 D 說明如何使用 LUT。我們使用 bt2020_to_bt709_example.cube

範例 C:18 Mbps 4K HDR 轉 SDR (使用 LUT)
ffmpeg -i strobe_scientist.mkv -y -b:v 18000000 -speed 4 -pass 1 \
  -pix_fmt yuv420p \
  -color_primaries 1 -color_trc 1 -colorspace 1 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 -profile:v 0 \
  -vf scale=-1:-1:in_color_matrix=bt2020,format=rgb48,lut3d=bt2020_to_bt709_example.cube,scale=-1:-1:out_color_matrix=bt709 \
  -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -i strobe_scientist.mkv -y -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p \
  -color_primaries 1 -color_trc 1 -colorspace 1 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 -profile:v 0 \
  -vf scale=-1:-1:in_color_matrix=bt2020,format=rgb48,lut3d=bt2020_to_bt709_example.cube,scale=-1:-1:out_color_matrix=bt709 \
  -vcodec libvpx-vp9 -f webm SDR_strobe_scientist_18Mbps-static.webm

將 HLG 轉換為 VP9 HLG10 10 位元 PQ

需要 HLG 來源。我們使用的輸入檔案為 strobe_scientist_hlg.mkv

範例 D:18 Mbps 4K 2-Pass HLG
ffmpeg -y -i strobe_scientist_hlg.mkv -b:v 18000000 -pass 1 -speed 4 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 18 -colorspace 9 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 \
  -profile:v 2 -vcodec libvpx-vp9 -f webm /dev/null && \
  ffmpeg -y -i strobe_scientist_hlg.mkv -b:v 18000000 -pass 2 \
  -pix_fmt yuv420p10le \
  -color_primaries 9 -color_trc 18 -colorspace 9 -color_range 1 \
  -maxrate 26800000 -minrate 8040000 \
  -profile:v 2 -vcodec libvpx-vp9 \
  HLG_HDR_strobe_scientist_18Mbps-static.webm

摘要

輸出檔案的大小不一。輸入的檔案大小為 4.3 GB。

範例 目標輸出 磁碟大小 編碼時間
A 6Mbps 4k Unscaled HDR 51.2MB 142m
B1 18 Mbps 4K 無縮放 HDR 161MB 213m
B2 18 Mbps 1080 縮放 HDR 160MB 1.13 億
C 18 Mbps HDR 轉 SDR 未縮放 165MB 1.24 億
D 18 Mbps HLG 轉換 165MB 1.68 億

請注意,建議使用 2-pass 編碼處理 HDR,因為 1-pass 編碼在某些設定中可能會有所不同。

在 WebM 和 MP4 輸出內容中標示 HDR 的工具 (Matroska 指令列工具)

撰寫本文時,FFmpeg 並未提供在 WebM/MKV 中指定 SMPTE 2086 靜態中繼資料的機制,但如果輸入串流包含這類資料,FFmpeg 會傳播該資料。

如果應用程式需要這項中繼資料,可以使用 mkvtoolnixmkvmerge 工具插入或修改這項中繼資料。

以下範例說明如何將 HDR 中繼資料插入上述建立的其中一個檔案。特別適合準備 HDR 內容上傳至 YouTube

mkvmerge \
  -o HDR_strobe_scientist_18Mbps.mkv\
  --colour-matrix 0:9 \
  --colour-range 0:1 \
  --colour-transfer-characteristics 0:16 \
  --colour-primaries 0:9 \
  --max-content-light 0:1000 \
  --max-frame-light 0:300 \
  --max-luminance 0:1000 \
  --min-luminance 0:0.01 \
  --chromaticity-coordinates 0:0.68,0.32,0.265,0.690,0.15,0.06 \
  --white-colour-coordinates 0:0.3127,0.3290 \
  HDR_strobe_scientist_18Mbps.webm

這個範例會在 0.6 秒內產生 HDR_strobe_scientist_18Mbps.mkv 檔案。