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
- 出力ファイル: 2pass_HDR_strobe_scientist_6Mbps-static.webm
- エンコード時間: 142 分 30 秒
- ディスク上のファイルサイズ: 51.2 MB
例 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
- 出力ファイル: 2pass_HDR_strobe_scientist_18Mbps-static.webm
- エンコード時間: 213 分 32 秒
- ディスク上のファイルサイズ: 161 MB
例 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
- 出力ファイル: 1080_2pass_HDR_strobe_scientist_18Mbps-static.webm
- エンコード時間: 113 分 9 秒
- ディスク上のファイルサイズ: 160 MB
ルックアップ テーブル(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
- 出力ファイル: SDR_strobe_scientist_18Mbps-static.webm
- エンコード時間: 124 分 23 秒
- ディスク上のファイルサイズ: 165 MB
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
- 出力ファイル: HLG_HDR_strobe_scientist_18Mbps-static.webm
- エンコード時間: 186 分 10 秒
- ディスク上のファイルサイズ: 165 MB
概要
出力ファイルのサイズはさまざまです。入力は 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 ファイルが生成されます。