VP9-HDR-Codierung
HDR-Videos (High Dynamic Range) sind eine sich entwickelnde Technologie. Es gibt heute eine Reihe von Standards, die schrittweise harmonisiert werden.
Einen Überblick über die Entwicklung von HDR-Videos findest du im Wikipedia-Artikel High-dynamic-range video.
FFmpeg kann zusammen mit VP9 verwendet werden, um (1) HDR-Quellen in SDR-Ausgaben (Standard Dynamic Range) zu komprimieren oder (2) eine HDR-Quelle in HDR-Webformate umzupacken.
Eingabequellen
Derzeit können beim Codieren von HDR mit VP9 alle von FFmpeg unterstützten Codecs mit hoher Bit-Tiefe (10 Bit) als Eingabe verwendet werden, z. B. VP9 Profil 2 und 3, H.264 (10 Bit), DNxHR, HEVC und ProRes. Weitere Informationen findest du im YouTube-Hilfeartikel HDR-Videos hochladen.
Reichweite der codierten Ausgabe:
Derzeit und im Allgemeinen werden alle Geräte unterstützt, die VP9 Profil 2 decodieren und auf einem HDR-Display ausgeben können.
- Chromecast Ultra + HDR-fähiger Fernseher
- Chrome 64 Canary unter Windows 10 Fall Creators Update mit aktiviertem HDR-Flag. Das ist ein gutes Tool für die Fehlerbehebung.
- HDR-Fernseher mit VP9-Profil 2
- Alle HDR-Modelle von Samsung aus dem Jahr 2017 (Liste auf flatpanelshd.com) und Modelle aus dem Jahr 2016, die mit „KS“ beginnen
- Alle HDR-Modelle von LG aus dem Jahr 2017 (sowie einige LG G6-Modelle aus dem Jahr 2016)
- Auf Mobilgeräten, die die hardwarebeschleunigte VP9-Decodierung (Profil 2) mit 10‑Bit-HDR unterstützen (z. B. Meizu Pro 7)
- UHD-Blu-ray von 2017
FFmpeg-Befehlszeileneinstellungen zum Aktivieren von VP9 Profil 2 und HDR-EOTFs
Ihre FFmpeg-Version muss mit 10‑Bit- (oder sogar 12‑Bit-)Unterstützung erstellt worden sein.
In den folgenden Beispielen verwenden wir ein statisch erstelltes ffmpeg
mit 10-Bit-Unterstützung.
Sie können unser Build-Script verwenden, um ein eigenes zu erstellen, oder der Anleitung auf der FFmpeg-Website folgen.
Nachfolgend finden Sie eine verwendbare FFmpeg-Befehlszeile für die HDR-Codierung nach SMPTE 2084 (PQ-EOTF)-Standards 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
Hier sind die wichtigsten Parameter, die wir eingeführt haben:
ffmpeg | Der statische Build mit 10-Bit-Unterstützung |
---|---|
-pass 1 |
Für HDR ist eine 2‑Pass-Codierung erforderlich. In diesem Beispiel wird der erste Durchgang in /dev/null ausgegeben und im zweiten Durchgang im Arbeitsspeicher verarbeitet. |
-pix_fmt yuv420p10le |
Legt das YUV 4:2:0 10‑Bit-Pixelformat fest. |
-color_primaries 9 |
Legt BT2020 fest. Weitere Informationen finden Sie auf den Seiten 5 und 6 dieses Dokuments. |
-color_trc 16 |
16 legt die Übertragungseigenschaften auf SMPTE 2084 fest. PQ 18 legt die Transfereigenschaften SMPTE 2086 HLG fest. |
-colorspace 9 |
colorspace sind die „matrix_coefficients“. Diese Einstellung sollte der Art und Weise entsprechen, wie die Inhalte gemastert wurden. (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 |
Verwende den VP9-Encoder. |
Beispiel-Encodings
In den folgenden Beispielen wird die Quelldatei strobe_scientist.mkv verwendet.
Allgemein gilt, dass bei der HDR-Codierung eine um 25–30% höhere Bitrate als bei der entsprechenden 8‑Bit-SDR-Codierung empfohlen wird. Die Beispiele sind in der Regel auf 18 Mbit/s ausgerichtet. Gute HDR-Ergebnisse lassen sich mit Bitraten von 12 Mbit/s erzielen, wenn die Einstellungen optimal sind.
Die Codierungen wurden auf einem Ubuntu Linux-System mit den folgenden Spezifikationen durchgeführt:
- Prozessor: 4 × Intel(R) Core(TM) i5-6500 CPU @ 3,20 GHz
- Arbeitsspeicher (RAM): 8060 MB (1492 MB verwendet)
- Grafik: Intel HD Graphics 530 (Skylake GT2)
- Betriebssystem: Ubuntu 16.04 LTS
In YUV 4:2:0 10‑Bit PQ konvertieren
Beispiel A: 6 Mbit/s, 4K, 2 Durchläufe
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
- Ausgabedatei: 2pass_HDR_strobe_scientist_6Mbps-static.webm
- Codierungszeit: 142 Min. 30 Sek.
- Dateigröße auf der Festplatte: 51,2 MB
Beispiel B1: 18 Mbit/s, 4K, 2 Durchgänge
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
- Ausgabedatei: 2pass_HDR_strobe_scientist_18Mbps-static.webm
- Codierungszeit: 213 Min. 32 Sek.
- Dateigröße auf der Festplatte: 161 MB
Beispiel B2: 18 Mbit/s, 1080p, 2 Durchgänge
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
- Ausgabedatei: 1080_2pass_HDR_strobe_scientist_18Mbps-static.webm
- Codierungszeit: 113 Min. 9 Sek.
- Dateigröße auf der Festplatte: 160 MB
HDR mit einer Look-up-Table (LUT) in SDR konvertieren
Bei der Konvertierung von HDR zu SDR muss der Transcoder wissen, wie Helligkeitsstufen und Farben dem kleineren BT.709-Farbraum und dem nicht-HDR-Helligkeitsbereich zugeordnet werden. Für optimale Ergebnisse kann eine LUT verwendet werden, die beschreibt, wie diese Zuordnung vorgenommen werden soll. Sie ist in der Regel spezifisch für die Inhalte. In den Beispielen C und D wird gezeigt, 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
- Ausgabedatei: SDR_strobe_scientist_18Mbps-static.webm
- Codierungszeit: 124 Min. 23 Sek.
- Dateigröße auf der Festplatte: 165 MB
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 Durchgänge, 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
- Ausgabedatei: HLG_HDR_strobe_scientist_18Mbps-static.webm
- Codierungszeit: 186 Min. 10 Sek.
- Dateigröße auf der Festplatte: 165 MB
Zusammenfassung
Die Ausgabedateien haben unterschiedliche Größen. Die Eingabe hatte eine Größe von 4,3 GB.
Beispiel | Zielausgabe | Größe auf dem Datenträger | Codierungszeit |
---|---|---|---|
A | 6 Mbit/s, 4K, unskaliertes HDR | 51,2 MB | 142 m |
B1 | 18 Mbit/s, 4K, unskaliertes HDR | 161 MB | 213 m |
B2 | 18 Mbit/s, 1080 Pixel, skaliertes HDR | 160 MB | 113 Mio. |
C | 18 Mbit/s HDR zu SDR unskaliert | 165 MB | 124 Mio. |
D | HLG-Umwandlung mit 18 Mbit/s | 165 MB | 168 Mio. |
Die 2-Pass-Codierung wird für HDR empfohlen, da die 1-Pass-Codierung in bestimmten Konfigurationen variieren kann.
Tools, die zum Signalisieren von HDR in WebM- und MP4-Ausgabe erforderlich sind (Matroska-Befehlszeilentools)
Zum Zeitpunkt der Erstellung dieses Dokuments bietet FFmpeg keinen Mechanismus zum Angeben statischer SMPTE 2086-Metadaten in WebM/MKV. Die Metadaten werden jedoch aus einem Eingabestream übernommen, wenn der Stream sie enthält.
Mit dem Tool mkvmerge, das Teil von mkvtoolnix ist, können Sie diese Metadaten einfügen oder ändern, wenn Ihre Anwendung dies erfordert.
Im Folgenden sehen Sie ein Beispiel für das Einfügen von HDR-Metadaten in eine der oben erstellten Dateien. Es eignet sich besonders gut für die Vorbereitung von HDR-Inhalten für den Upload auf 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
In diesem Beispiel wird die Datei HDR_strobe_scientist_18Mbps.mkv in 0,6 Sekunden erstellt.