VP9 HDR エンコード

ハイ ダイナミック レンジ(HDR)動画は成熟しつつあるテクノロジーです。現在、徐々に調和が進んでいる基準が多数存在します。

HDR 動画の進化の概要については、Wikipedia の記事「ハイ ダイナミック レンジ動画」をご覧ください。

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 で HDR フラグをオンにした Chrome 64 Canary。(これは優れたデバッグツールです)。
  • VP9 プロファイル 2 を搭載した HDR テレビ
    • Samsung の 2017 年の HDR モデルすべて(flatpanelshd.com のリスト)と「KS」で始まる 2016 年モデル
    • LG の 2017 年 HDR モデル(一部の 2016 年 LG G6 モデルも含む)
    • モバイルでは、ハードウェア アクセラレーションによる VP9 Profile 2 10 ビット HDR デコードをサポートするデバイス(Meizu Pro 7
    • 2017 年の UHD Bluray

VP9 Profile 2 と HDR EOTF を有効にする FFmpeg コマンドライン設定

FFmpeg は 10 ビット(または 12 ビット)のサポートでビルドされている必要があります。

以下の例では、10 ビットをサポートする静的にビルドされた ffmpeg を使用します。独自のビルドスクリプトを作成するには、Google のビルドスクリプトを使用するか、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 は、伝達特性を 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 の場合は、プロファイル、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.20GHz
  • メモリ(RAM): 8060MB(1492MB 使用)
  • グラフィック: 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 6Mbps 4k Unscaled HDR 51.2MB 142 分
B1 18 Mbps 4K スケールなし HDR 161MB 213m
B2 18 Mbps 1080 スケール HDR 160 MB 1 億 1,300 万
C 18 Mbps HDR から SDR へのスケーリングなし 165MB 124m
D 18 Mbps HLG 変換 165MB 168m

なお、1 パスは特定の構成で変動する可能性があるため、HDR には 2 パス エンコードが推奨されます。

WebM と MP4 の出力で HDR をシグナリングするために必要なツール(Matroska コマンドライン ツール)

このドキュメントの作成時点では、FFmpeg には WebM/MKV で SMPTE 2086 静的メタデータを指定するメカニズムはありませんが、ストリームにメタデータが含まれている場合は、入力ストリームから伝播されます。

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

以下は、上記の作成されたファイルの 1 つに 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

この例では、0.6 秒で HDR_strobe_scientist_18Mbps.mkv ファイルが生成されます。