VP9 HDR-Codierung

High Dynamic Range-Videos (HDR) sind eine veraltete Technologie. Mittlerweile gibt es eine Reihe von Standards, die nach und nach harmonisiert werden.

Ein gepflegtes Bild der HDR-Videoentwicklung findest du im WikiPedia-Artikel High-Dynamic-range video.

FFmpeg kann zusammen mit VP9 verwendet werden, um (1) HDR-Quellen auf Standard-Dynamic-Range-Ausgabe (SDR) zu komprimieren oder (2) eine HDR-Quelle in für das Web geeignete HDR-Formate zu bündeln.

Eingabequellen

Bei der Codierung von HDR mit VP9 können derzeit alle von FFmpeg unterstützten Codebits mit hoher Bittiefe (z. B. VP9 Profil 2 und 3, H.264 (10-Bit), DNxHR, HEVC, ProRes usw.) verwendet werden. Außerdem findest du im YouTube-Supportartikel High Dynamic Range (HDR)-Videos hochladen.

Codierte Ausgabereichweite:

Zu den unterstützten Geräten gehören derzeit alle Geräte, die VP9 Profil 2 decodieren und auf ein HDR-Display übertragen können.

  • Chromecast Ultra + HDR-fähiger Fernseher
  • Chrome 64 Canary unter Windows 10 Fall Creators Update mit aktiviertem HDR-Flag. (Dies ist ein gutes Debugging-Tool.)
  • HDR-Fernseher mit VP9-Profil 2
    • Alle HDR-Modelle von Samsung (2017) (Flatpanelshd.com-Liste) und 2016er-Modelle, beginnend mit &KS
    • Alle HDR-Modelle von LG 2017 (auch einige LG G6-Modelle von 2016)
    • Auf Mobilgeräten, auf denen die beschleunigte VP9-Profilerstellung 2 unterstützt wird, 10-Bit-HDR-Decodierung (Meizu Pro 7)
    • UHD Bluray aus dem Jahr 2017

FFmpeg-Befehlszeileneinstellungen zur Aktivierung von VP9 Profile 2 und HDR-OTT

Deine FFmpeg muss mit 10-Bit- oder sogar 12-Bit-Unterstützung ausgestattet sein.

In den folgenden Beispielen verwenden wir eine statisch erstellte ffmpeg mit 10-Bit-Unterstützung. Du kannst sie mithilfe unseres Build-Skripts selbst erstellen oder der Anleitung auf der FFmpeg-Website folgen.

Nachfolgend sehen Sie eine verwendbare FFmpeg-Befehlszeile für die HDR-Codierung nach SMPTE 2084 (PQ EOTF) mit 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

Die hier eingeführten Schlüsselparameter können aufgeschlüsselt werden:

ffmpeg Der statische Build mit 10-Bit-Unterstützung
-pass 1 HDR erfordert eine 2-Pass-Codierung. In diesem Beispiel wird der erste Pass an /dev/null ausgegeben und während des zweiten Passes im Arbeitsspeicher verarbeitet.
-pix_fmt yuv420p10le Legt das YUV-Format 4:2:0 oder ein 10-Bit-Pixel fest
-color_primaries 9 Legt BT2020 fest. Weitere Informationen finden Sie auf Seite 5 und 6 in diesem Dokument.
-color_trc 16 16 legt die Übertragungseigenschaften auf SMPTE 2084 fest. PQ 18 legt Übertragungseigenschaften fest SMPTE 2086 HLG
-colorspace 9 colorspace ist der "Matrix_Koeffizienten." Diese sollte konsistent mit dem Mastering des Contents übereinstimmen. (z.B. bt709, bt2020_ncl). In diesem Beispiel sollte es 9 für bt2020_ncl sein. Weitere Informationen finden Sie auf Seite 12 dieses Dokuments.
-color_range 1 Farbbereich (0 = nicht angegeben, 1 = mpeg/studio/tv, 2 = jpeg/full/pc)
-profile:v 2 Für HDR ist ein Profil oder 2 oder 3 erforderlich.
-vcodec libvpx-vp9 VP9-Encoder verwenden.

Beispielcodierungen

In den folgenden Beispielen wird die Quelldatei strobe_scientist.mkv verwendet.

Als allgemeiner Hinweis zu Bitraten mit HDR-Codierung wird eine 25–30% höhere Bitrate als eine entsprechende 8-Bit-SDR-Codierung empfohlen. Die Beispiele sind normalerweise auf 18 Mbit/s ausgerichtet. Für gute HDR-Ergebnisse sind 12 Mbit/s Bitraten bei optimaler Feinabstimmung verfügbar.

Die Codierungen wurden auf einem Ubuntu-Linux-System mit den folgenden Spezifikationen durchgeführt:

  • Prozessor: 4x Intel(R) Core(TM) i5-6500 CPU mit 3,20 GHz
  • Arbeitsspeicher (RAM): 8.060 MB (1.492 MB verwendet)
  • Grafik: Intel HD Graphics 530 (Skylake GT2)
  • Betriebssystem: Ubuntu 16.04 LTS

In YUV konvertieren 4:2:0 10-Bit-PQ

Beispiel A: 6 Mbit/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
Beispiel B1: 18 Mbit/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
Beispiel B2: 18 Mbit/s 1.080p (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

HDR mithilfe einer Nachverfolgungstabelle (LUT) in SDR konvertieren

Zum Konvertieren von HDR in SDR muss der Transcoder verstehen, wie Helligkeits- und Farbwerte dem kleineren BT.709-Farbraum und anderen Helligkeitsbereich zugeordnet werden. Die besten Ergebnisse erzielen Sie mit einer LUT, in der beschrieben wird, wie die Zuordnung vorgenommen wird, die in der Regel inhaltsspezifisch ist. Die Beispiele C und D zeigen, wie eine LUT verwendet wird. Wir haben bt2020_to_bt709_example.cube verwendet.

Beispiel C: 18 Mbit/s 4K HDR zu SDR mit 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 in VP9 HLG10 10-Bit PQ konvertieren

Erfordert eine HLG-Quelle. Wir haben die Eingabedatei strobe_scientist_hlg.mkv verwendet.

Beispiel D: 18 Mbit/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

Zusammenfassung

Die Ausgabedateien sind unterschiedlich groß. Die Eingabe betrug 4,3 GB.

Beispiel Zielausgabe Größe auf Festplatte Codieren
V 6 Mbit/s 4K nicht skalierter HDR-Wert 51,2 MB 142 Mio.
B1 18 Mbit/s 4K-Eskalierung im HDR-Format 161 213m
B2 18 Mbit/s, 1.080 skaliert, HDR 160MB 113m
C 18 Mbit/s HDR zu SDR 165 124m
D 18 Mbit/s HLG-Konvertierung 165 168m

Beachten Sie, dass die 2-Pass-Codierung für HDR empfohlen wird, da der 1-Pass in bestimmten Konfigurationen variieren kann.

Tools zur Signalisierung von HDR in der WebM- und MP4-Ausgabe (Matroska-Befehlszeilentools)

Zum Zeitpunkt der Erstellung dieses Skripts stellt FFmpeg einen Mechanismus zur Angabe statischer SMPTE-2086-Metadaten in WebM/MKV bereit, der aber von einem Eingabestream übertragen wird, wenn er darin enthalten ist.

Das mkvmerge-Tool, Teil von mkvtoolnix, kann zum Einfügen oder Ändern dieser Metadaten verwendet werden, wenn dies für deine Anwendung erforderlich ist.

Hier siehst du ein Beispiel für das Einfügen von HDR-Metadaten in eine der oben erstellten Dateien. Das Tool ist besonders dafür geeignet, HDR-Inhalte für den Upload auf YouTube vorzubereiten.

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

In diesem Beispiel wird die Datei HDR_strobe_scientist_18Mbit.mkv in 0,6 Sekunden erzeugt.