Kodowanie HDR w VP9

Filmy High Dynamic Range (HDR) to rozwijająca się technologia. Obecnie istnieje wiele stopniowo ujednolicanych standardów.

Aktualne informacje o rozwoju filmów HDR znajdziesz w artykule w Wikipedii High-dynamic-range video (w języku angielskim).

FFmpeg można używać z VP9 do (1) kompresowania źródeł HDR do wyjść o standardowym zakresie dynamiki (SDR) lub (2) do przekształcania źródła HDR w formaty HDR przyjazne dla internetu.

Źródła danych wejściowych

Obecnie podczas kodowania HDR za pomocą VP9 jako danych wejściowych można używać dowolnych kodeków o wysokiej głębi bitowej (10-bitowych) obsługiwanych przez FFmpeg (np. VP9 Profile 2 i 3, H.264 (10-bitowy), DNxHR, HEVC, ProRes itp.). Zapoznaj się też z artykułem w Centrum pomocy YouTube Przesyłanie filmów High Dynamic Range (HDR).

Zasięg zakodowanych danych wyjściowych:

Obecnie i ogólnie obsługiwane urządzenia docelowe to wszystkie urządzenia, które mogą dekodować VP9 Profile 2 i wyświetlać obraz na ekranie HDR.

  • Chromecast Ultra + telewizor obsługujący HDR
  • Chrome 64 Canary w systemie Windows 10 Fall Creators Update z włączoną flagą HDR. (To dobre narzędzie do debugowania).
  • Dowolny telewizor HDR z profilem VP9 2
    • Wszystkie modele HDR firmy Samsung z 2017 r. (lista na flatpanelshd.com) i modele z 2016 r. zaczynające się od „KS”
    • Wszystkie modele LG HDR z 2017 roku (również niektóre modele LG G6 z 2016 roku)
    • Na urządzeniach mobilnych obsługujących dekodowanie sprzętowe VP9 Profile 2 10-bit HDR (Meizu Pro 7)
    • UHD Bluray z 2017 r.

Ustawienia wiersza poleceń FFmpeg umożliwiające włączenie VP9 Profile 2 i HDR EOTF

FFmpeg musi być zbudowany z obsługą 10-bitowego (lub nawet 12-bitowego) kodowania.

W przykładach poniżej używamy statycznie utworzonego ffmpeg z obsługą 10-bitowego zakresu. Możesz użyć naszego skryptu kompilacji, aby utworzyć własny, lub postępować zgodnie z instrukcjami na stronie FFmpeg.

Poniżej znajdziesz wiersz poleceń FFmpeg, którego możesz użyć do kodowania HDR zgodnie ze standardami SMPTE 2084 (PQ EOTF) z kodekiem 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

Oto kluczowe parametry, które zostały tu wprowadzone:

ffmpeg Statyczna wersja z obsługą 10-bitową
-pass 1 HDR wymaga kodowania dwuprzebiegowego. W tym przykładzie pierwszy przebieg jest zapisywany w /dev/null i przetwarzany w pamięci podczas drugiego przebiegu.
-pix_fmt yuv420p10le Ustawia 10-bitowy format pikseli YUV 4:2:0.
-color_primaries 9 Ustawia BT2020 Więcej informacji znajdziesz na stronach 5 i 6 tego dokumentu.
-color_trc 16 16 ustawia cechy transferu na SMPTE 2084. PQ 18 ustawia cechy transferu SMPTE 2086 HLG
-colorspace 9 colorspace to „matrix_coefficients”. Należy go ustawić zgodnie z tym, jak treści zostały zmasterowane. (np. bt709, bt2020_ncl). W tym przykładzie powinna to być wartość 9 dla bt2020_ncl. Więcej informacji znajdziesz na stronie 12 tego dokumentu.
-color_range 1 Zakres kolorów (0 = nieokreślony, 1 = mpeg/studio/tv, 2 = jpeg/full/pc)
-profile:v 2 W przypadku HDR wymagany jest profil lub 2 albo 3.
-vcodec libvpx-vp9 Użyj kodera VP9.

Przykładowe kodowania

Wszystkie podane niżej przykłady korzystają z pliku źródłowego strobe_scientist.mkv.

Ogólnie rzecz biorąc, w przypadku kodowania HDR zalecana jest szybkość transmisji bitów o 25–30% wyższa niż w przypadku równoważnego 8-bitowego kodowania SDR. Przykłady zwykle dotyczą 18 Mb/s. Dobre wyniki HDR można uzyskać przy szybkości transmisji bitów 12 Mb/s przy optymalnym dostrajaniu.

Kodowanie zostało przeprowadzone w systemie Ubuntu Linux o tych specyfikacjach:

  • Procesor: 4 x Intel(R) Core(TM) i5-6500 CPU @ 3,20 GHz
  • Pamięć (RAM): 8060 MB (1492 MB używane)
  • Grafika: Intel HD Graphics 530 (Skylake GT2)
  • System operacyjny: Ubuntu 16.04 LTS

Konwertuj na YUV 4:2:0 10-bit PQ

Przykład A: 6 Mb/s 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
Przykład B1: 18 Mb/s 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
Przykład B2: 18 Mb/s, 1080p, 2 przebiegi
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

Konwertowanie HDR na SDR za pomocą tabeli LUT

Konwersja HDR do SDR wymaga od transkodera zrozumienia, jak mapować poziomy jasności i kolory na mniejszą przestrzeń kolorów BT.709 i zakres jasności nie-HDR. Aby uzyskać najlepsze wyniki, można użyć tabeli LUT opisującej sposób przeprowadzenia tego mapowania, która jest zwykle dostosowana do konkretnych treści. Przykłady C i D pokazują, jak używać tabeli LUT. Użyliśmy pliku bt2020_to_bt709_example.cube.

Przykład C: 18 Mb/s 4K HDR do SDR z 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

Konwertowanie HLG na VP9 HLG10 10-bit PQ

Wymaga źródła HLG. Użyliśmy pliku wejściowego strobe_scientist_hlg.mkv.

Przykład D: 18 Mb/s 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

Podsumowanie

Pliki wyjściowe mają różne rozmiary. Dane wejściowe miały rozmiar 4,3 GB.

Przykład Docelowe dane wyjściowe Rozmiar na dysku Czas kodowania
A 6 Mb/s 4K nieskalowany HDR 51,2 MB 142 mln
B1 18 Mb/s 4K bez skalowania HDR 161 MB 213 mln
B2 18 Mb/s, 1080p, skalowany HDR 160 MB 113 mln
C 18 Mb/s HDR do SDR bez skalowania 165 MB 124 mln
D Konwersja HLG 18 Mb/s 165 MB 168 mln

W przypadku HDR zalecane jest kodowanie 2-przebiegowe, ponieważ w niektórych konfiguracjach kodowanie 1-przebiegowe może się różnić.

Narzędzia potrzebne do sygnalizowania HDR w wyjściowych plikach WebM i MP4 (narzędzia wiersza poleceń Matroska)

W momencie pisania tego artykułu FFmpeg nie udostępnia mechanizmu do określania statycznych metadanych SMPTE 2086 w WebM/MKV, ale będzie je propagować ze strumienia wejściowego, jeśli strumień je zawiera.

Narzędzie mkvmerge, które jest częścią pakietu mkvtoolnix, może służyć do wstawiania lub modyfikowania tych metadanych, jeśli wymaga tego Twoja aplikacja.

Poniżej znajdziesz przykład wstawiania metadanych HDR do jednego z utworzonych powyżej plików. Jest on szczególnie przydatny do przygotowywania treści HDR do przesłania do 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

W tym przykładzie plik HDR_strobe_scientist_18Mbps.mkv zostanie utworzony w 0,6 sekundy.