VP9 HDR エンコード

ハイ ダイナミック レンジ(HDR)動画は成熟したテクノロジーです。現在、いくつかの基準が徐々に統一されています。

HDR 動画の進化の維持された図については、WikiPedia の記事 High-dynamic-range video をご覧ください。

FFmpeg と一緒に VP9 を使用すると、(1)HDR ソースを標準ダイナミック レンジ(SDR)出力に圧縮したり、(2)HDR ソースを HDR ウェブ フレンドリーな形式に再パッケージ化したりできます。

入力ソース

現在、VP9 で HDR をエンコードする場合、FFmpeg でサポートされている高ビット深度(10 ビット)のコーデックを入力として使用できます(例: VP9 プロファイル 2 と 3、H.264(10 ビット)、DNxHR、HEVC、ProRes など)。また、YouTube サポート記事のハイ ダイナミック レンジ(HDR)動画をアップロードするもご覧ください。

エンコードされた出力リーチ:

現在および一般に、サポートされているターゲット デバイスは、VP9 プロファイル 2 をデコードして HDR ディスプレイに出力できるデバイスです。

  • Chromecast Ultra + HDR 対応テレビ
  • Windows 10 Fall Creators Update の Chrome 64 Canary で、HDR フラグをオンにしました。(これは優れたデバッグツールです)。
  • VP9 プロファイル 2 を搭載した HDR テレビ
    • Samsung 2017 HDR モデル(flatpanelshd.com list)と KS-quot; で始まる 2016 年モデル
    • すべての LG 2017 HDR モデル(2016 年の LG G6 モデルの一部)
    • モバイル デバイスでは、ハードウェア アクセラレーションによる VP9 プロファイル 2 の 10 ビット HDR デコードをサポートするデバイス(Meizu Pro 7
    • UHD Bluray(2017 年)

FFmpeg のコマンドライン設定で VP9 プロファイル 2 と HDR EOTF を有効にする

FFmpeg は 10 ビット(または 12 ビット)のサポートを備えたものである必要があります。

以下の例では、10 ビットをサポートする静的にビルドされた ffmpeg を使用しています。ビルド スクリプトを使用して独自のスクリプトを作成することも、FFmpeg サイトのガイダンスに従うこともできます。

以下は、VP9 を使用した SMPTE 2084(PQ EOTF)標準への HDR エンコードに使用できる FFmpeg コマンドラインです。

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 パス エンコードが必要です。この例では、最初のパスは /dev/null に出力され、2 番目のパス中にメモリ内で処理されます。
-pix_fmt yuv420p10le YUV 4:2:0 の 10 ビット ピクセル形式を設定します
-color_primaries 9 BT2020 を設定します。詳しくは、このドキュメントの 5、6 ページを参照してください。
-color_trc 16 16 は Transfer Characteristics を SMPTE 2084 に設定します。PQ 18 は Transfer Characteristics SMPTE 2086 HLG を設定
-colorspace 9 colorspace は「行列係数」です。コンテンツは、マスタリングの方法に合わせて設定する必要があります。(例: bt709、bt2020_ncl)。この例では、bt2020_ncl の場合は 9 です。詳しくは、このドキュメントの 12 ページをご覧ください
-color_range 1 色範囲(0 = 指定なし、1 = mpeg/studio/tv、2 = jpeg/full/pc)
-profile:v 2 HDR の場合、プロファイル、または 2 または 3 が必要です。
-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.20 GHz
  • メモリ(RAM): 8,060 MB(1,492 MB 使用)
  • グラフィック: Intel HD Graphics 530(Skylake GT2)
  • OS: Ubuntu 16.04 LTS

YUV 4:2:0 10 ビット PQ に変換

例 A: 6 Mbps 4K 2 パス
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 パス
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 パス
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 パス 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 6 Mbps 4K 未スケーリング HDR 51.2MB 1 億 4,200 万
B1 18 Mbps 4K 未スケーリング HDR 161MB 2 億 1,300 万
B2 18 Mbps 1080 スケーリング HDR 160 MB 1 億 1,300 万
C 18 Mbps HDR から SDR にスケーリングなし 165MB 1 億 2,400 万
D 18 Mbps HLG 変換 165MB 1 億 6,800 万

HDR の場合、1 パスは構成によって異なるため、2 パス エンコードをおすすめします。

WebM と MP4 出力の HDR シグナルに必要なツール(Matroska コマンドライン ツール)

現時点では、FFmpeg は WebM/MKV で SMPTE 2086 静的メタデータを指定するメカニズムは提供していませんが、ストリームを含む入力ストリームから伝播されます。

アプリケーションに必要な場合は、mkvtoolnix に含まれる mkvmerge ツールを使用してこのメタデータを挿入または変更できます。

上で作成したファイルのいずれかに HDR メタデータを挿入する例を以下に示します。これは、YouTube にアップロードする HDR コンテンツの準備に特に適しています。

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

この例では、HDR_strobe_scientist_18Mbps.mkv を 0.6 秒で生成します。