Zweck

In diesem Abschnitt finden Sie Empfehlungen zu VP9-Codierungseinstellungen bei der dateibasierten Codierung, d.h. nicht live.

Diese Empfehlungen sind auf die folgenden Ziele ausgerichtet:

  • Die richtige Balance zwischen Qualität und Codierungsgeschwindigkeit
  • Die minimale Bitrate für eine angemessene Qualität
  • Einstellungen für eine Vielzahl von Inhaltstypen

Folgendes gilt nicht:

  • Live-Codierung für Adresse
  • Für bestimmte Inhaltstypen optimieren (z.B. High-Motion-Sportaufnahmen)
  • Einstellungen für bestimmte Geräte- oder Netzwerkanforderungen konfigurieren

Codierung mit einer Auflösung

VP9 unterstützt verschiedene Frame-Größen – von winzigen Auflösungen bis zu 4K. Größere Frame-Größen bieten eine höhere Qualität, benötigen aber mehr Bandbreite und zur Decodierung zusätzliche Verarbeitungsleistung.

Wenn Sie nur eine einzige Auflösung erstellen, ist 640 x 480 eine sichere Wahl für alle Web- und Mobilgeräte. Mit den folgenden FFmpeg-Befehlszeilenparametern können Sie eine Datei mit einer Auflösung von 750 kBit/s erstellen.

-vf scale=640x480 -b:v 750k -quality good -speed 0 -crf 33 \
  -c:v libvpx-vp9 -c:a libopus output.webm

Codierung in mehreren Auflösungen

Wenn Sie mehrere Auflösungen planen möchten oder Ihr Bereitstellungsnetzwerk unterschiedliche Bandbreite hat, wird empfohlen, mehrere Auflösungen zu erstellen. Der Player kann dann festlegen, welche Auflösung an den Zuschauer gesendet wird.

Videocodierungen mit mehreren Auflösungen werden oft für das Streaming mit adaptiver Bitrate verwendet, wobei der Videoplayer in Echtzeit anhand der Bandbreite des Nutzers zwischen Auflösungen wechselt. Mit Shaka Player können Sie beispielsweise Codierungen mit mehreren Auflösungen abspielen, wobei sich jede VP9-Codierung in einer separaten Datei befindet und ein DASH-Manifest Informationen zu den einzelnen Codierungen bereitstellt.

Weitere Informationen zum Verpacken von Videos in adaptiven Streamingformaten findest du unter Shaka Packager. In diesem Leitfaden konzentrieren wir uns auf die Codierungseinstellungen für VP9 in mehreren Auflösungen.

Alle der folgenden Einstellungen können für einzelne Dateien in verschiedenen Auflösungen verwendet werden. In Kombination bieten sie einen umfassenden Satz, der für adaptives Streaming geeignet ist. Die Version 640 x 480 hat zwei Versionen: eine mit niedriger Qualität (LQ) und eine mit niedriger Qualität (MQ).

Bitrate

Der Modus „Begrenzte Qualität (CQ)“ wird beim Codieren von VP9-Dateien für die On-Demand-Wiedergabe empfohlen. Mit diesem Codierungsmodus kannst du eine durchschnittliche Ziel-Bitrate angeben und gleichzeitig die maximale Qualität des Videos sowie die minimale und maximale Bitrate steuern.

Die folgenden Bitraten werden als Referenz für die Web- und mobile Verteilung vorgeschlagen. Durch diese Vorschläge wird die Bitrate minimiert, die für die Web- und mobile Verteilung von Nutzern geeignet ist. Sie ist eine Bitrate von Empfehlungen mit geringer Bitrate, die aber dennoch eine angemessene Qualität erreichen kann.

Für die obigen Beispiele empfiehlt es sich, eine Mindestbitrate von 50 % für die Zielbitrate und maximal 145% für das Ziel festzulegen.

Frame-Größe/Framerate Ziel-Bitrate (VOD, kbit/s) Min. Bitrate (50%) Max. Bitrate (145%)
320 x 240p bei 24,25,30 150 75 218
640 x 360p bei 24,25,30 276 138 400
640 x 480p bei 24,25,30 512 (LQ), 750 (MQ) 256 (LQ) 375 (MQ) 742 (LQ) 1088 (MQ)
1280 × 720p bei 24,25,30 1.024 512 1485
1.280 × 720p bei 50,60 1.800 900 2610
1920 × 1080p bei 24,25,30 1.800 900 2610
1920 × 1080p bei 50,60 3.000 1.500 4350
2560 x 1440p bei 24,25,30 6.000 3.000 8700
2.560 x 1.440 p bei 50,60 9000 4.500 13050
3840 x 2160p bei 24,25,30 12000 6.000 17400
3840 × 2160p bei 50,60 18000 9000 26100

Abbildung 2a: Empfohlene VOD-Bitraten

In FFmpeg wird die Bitrate mit den folgenden Befehlen gesteuert:

FFMPEG
-b:v <arg> Legt die Bitrate fest (z. B. 500.000)
-minrate <arg>
-maxrate <arg>
Legt die minimale und maximale Bitrate fest.

Wenn du beispielsweise Inhalte im Format 640 x 480 codieren möchtest, kannst du die Befehlszeile -b:v 750k -minrate 375 -maxrate 1088 verwenden.

Qualität

Im CQ-Modus legen Sie außerdem die maximale Qualitätsstufe fest. Für dateibasierte VP9-Codierungen werden die folgenden Qualitätsstufen empfohlen:

Frame-Höhe Zielqualität
240 37
360 36
480 34 (LQ) oder 33 (MQ)
720 32
1080 31
1440 24
2160 15

In FFmpeg wird die Qualität mit dem Befehl -crf festgelegt. Wenn Sie beispielsweise die Qualität auf 33 festlegen möchten, verwenden Sie den Befehl -crf 33.

Multipass-Codierung und Codierungsgeschwindigkeit

Eine dateibasierte Codierung ermöglicht Ihnen eine hohe Geschwindigkeit. Du kannst auch mehrere Karten/Tickets für dasselbe Material ausführen, um die Qualität zu erhöhen, und Geschwindigkeiten für die einzelnen Materialien auswählen.

Wenn Sie VP9-Dateien in FFmpeg codieren, empfehlen wir, den Parameter -quality auf good und dann die Geschwindigkeit des ersten und zweiten Passes gemäß der Tabelle unten mit dem Parameter -speed festzulegen. So erhalten Sie ein gutes Gleichgewicht zwischen Codierungszeit und Ausgabequalität.

Frame-Höhe Speed (First Pass) Geschwindigkeit Speed (Zweiter Pass)
240 4 1
360 4 1
480 4 1
720 4 2
1080 4 2
1440 4 2
2160 4 2

Ein erster Passcode-String in FFmpeg könnte beispielsweise -quality good -speed 4 enthalten.

Keyframe-Abstand

Es wird empfohlen, bis zu 240 Frames auf Videos zwischen den Keyframes zu erlauben (8 Sekunden für 30 fps). Keyframes sind selbstständige Videoframes. Sie nutzen zum Rendern keine anderen Frames, sie sind aber in der Regel größer als andere Frametypen. Bei der Web- und mobilen Wiedergabe kann der Encoder dank der großzügigen Abstände zwischen den Keyframes die optimale Platzierung der Keyframes auswählen, um die Qualität zu maximieren.

Im FFmpeg-Keyframe- Abstand wird der Befehl -g gesteuert, der die Anzahl der Frames angibt. Bei 240 Frames wäre das -g 240.

Tiling- und Thread-Empfehlungen

Durch die Tiding-Funktion wird der Videoframe in mehrere Spalten aufgeteilt. Dadurch wird die Qualität geringfügig reduziert, aber die Codierungsleistung wird beschleunigt. Kacheln müssen mindestens 256 Pixel breit sein. Deshalb ist die Anzahl der möglichen Kacheln begrenzt.

Je nach Anzahl der Kacheln und Auflösung des Ausgabeframes können mehr CPU-Threads hilfreich sein. Allgemein ausgedrückt, ist der Wert für mehrere Threads begrenzt, wenn die Größe des Ausgabe-Frames sehr klein ist.

Die folgenden Einstellungen werden für das Kachel- und Threading bei verschiedenen Auflösungen empfohlen.

Frame-Größe Anzahl der Kachelspalten Anzahl der Threads
320 x 240 1 (-tile-columns 0) 2
640 x 360 2 (-tile-columns 1) 4
640 x 480 2 (-tile-columns 1) 4
1.280 x 720 4 (-tile-columns 2) 8
1.920 x 1.080 4 (-tile-columns 2) 8
2560x1440 8 (-tile-columns 3) 16
3.840 x 2.160 8 (-tile-columns 3) 16

In FFmpeg wird die Anzahl der Kacheln durch den Parameter -tile-columns und die Anzahl der Threads von -threads gesteuert. Eine 640-x-480-Codierung würde beispielsweise die Befehlszeile -tile-columns 2 -threads 4 verwenden.

FFmpeg-Befehlszeilen

Wenn Sie die oben genannten Empfehlungen zusammenführen, können die folgenden FFmpeg-Befehle für die Codierung von VP9-Inhalten verwendet werden.

Beachten Sie, dass der Befehl für den ersten und zweiten Pass verkettet ist. Das Argument -y im Befehl für den zweiten Pass gibt die Antwort „Ja“ an, wenn FFmpeg anfordert, die Statistikdatei für den ersten Pass mit dem Ausgabevideo zu überschreiben.

Außerdem wird eine 1.080p-Quelle für Codierungen mit einer Leistung von bis zu 1.280 × 720 verwendet. Eine 4K-Quelle wird für eine höhere Ausgabe verwendet.

320 × 240 (24, 25 oder 30 Bilder pro Sekunde)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=320x240 -b:v 150k \
  -minrate 75k -maxrate 218k -tile-columns 0 -g 240 -threads 2 \
  -quality good -crf 37 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-320x240.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=320x240 -b:v 150k \
  -minrate 75k -maxrate 218k -tile-columns 0 -g 240 -threads 2 \
  -quality good -crf 37 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 1 -y tos-320x240.webm

640 × 360 (24, 25 oder 30 Bilder pro Sekunde)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x360 -b:v 276k \
  -minrate 138k -maxrate 400k -tile-columns 1 -g 240 -threads 4 \
  -quality good -crf 36 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x360 -b:v 276k \
  -minrate 138k -maxrate 400k -tile-columns 1 -g 240 -threads 4 \
  -quality good -crf 36 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-640x360.webm

640 × 480 (niedrige Qualität, 24, 25 oder 30 Bilder pro Sekunde)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 512k \
  -minrate 256k -maxrate 742k -tile-columns 1 -g 240 -threads 4 \
  -quality good -crf 34 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360-low.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 512k \
  -minrate 256k -maxrate 742k -tile-columns 1 -g 240 -threads 4 \
  -quality good -crf 34 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-640x480-low.webm

640 × 480 (mittlere Qualität, 24, 25 oder 30 Bilder pro Sekunde)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 750k \
  -minrate 375k -maxrate 1088k -tile-columns 1 -g 240 -threads 4 \
  -quality good -crf 33 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-640x360-medium.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=640x480 -b:v 750k \
  -minrate 375k -maxrate 1088k -tile-columns 1 -g 240 -threads 4 \
  -quality good -crf 33 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-640x480-medium.webm

1280 × 720 (24, 25 oder 30 Bilder pro Sekunde)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1024k \
  -minrate 512k -maxrate 1485k -tile-columns 2 -g 240 -threads 8 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1280x720-24-30fps.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1024k \
  -minrate 512k -maxrate 1485k -tile-columns 2 -g 240 -threads 8 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-1280x720-24-30fps.webm

1.280 × 720 (50 oder 60 Bilder pro Sekunde)

ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 8 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1280x720-50-60fps.webm && \
ffmpeg -i tears_of_steel_1080p.webm -vf scale=1280x720 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 8 \
  -quality good -crf 32 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4-y tos-1280x720-50-60fps.webm

1.920 × 1.080 (24, 25 oder 30 Bilder pro Sekunde)

ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 2 -g 240 -threads 8 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1920x1080-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 1800k \
  -minrate 900k -maxrate 2610k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-1920x1080-24-30fps.webm

1.920 × 1.080 (50 oder 60 Bilder pro Sekunde)

ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 3000k \
  -minrate 1500k -maxrate 4350k -tile-columns 2 -g 240 -threads 8 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-1920x1080-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=1920x1080 -b:v 3000k \
  -minrate 1500k -maxrate 4350k -tile-columns 3 -g 240 -threads 8 \
  -quality good -crf 31 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-1920x1080-50-60fps.webm

2.560 x 1.440 (24, 25 oder 30 Bilder pro Sekunde)

ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 6000k \
  -minrate 3000k -maxrate 8700k -tile-columns 3 -g 240 -threads 16 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-2560x1440-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 6000k \
  -minrate 3000k -maxrate 8700k -tile-columns 3 -g 240 -threads 16 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-2560x1440-24-30fps.webm

2.560 x 1.440 (50 oder 60 Bilder pro Sekunde)

ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 9000k \
  -minrate 4500k -maxrate 13050k -tile-columns 3 -g 240 -threads 16 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-2560x1440-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=2560x1440 -b:v 9000k \
  -minrate 4500k -maxrate 13050k -tile-columns 3 -g 240 -threads 16 \
  -quality good -crf 24 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-2560x1440-50-60fps.webm

3840 × 2160 (24, 25 oder 30 Bilder pro Sekunde)

ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 12000k \
  -minrate 6000k -maxrate 17400k -tile-columns 3 -g 240 -threads 24 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-3840x2160-24-30fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 12000k \
  -minrate 6000k -maxrate 17400k -tile-columns 3 -g 240 -threads 24 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -speed 4 -y tos-3840x2160-24-30fps.webm

3.840 x 2.160 (50 oder 60 Bilder pro Sekunde)

ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 18000k \
  -minrate 9000k -maxrate 26100k -tile-columns 3 -g 240 -threads 24 \
  -quality good -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 1 -speed 4 tos-3840x2160-50-60fps.webm && \
ffmpeg -i tearsofsteel_4k.mov -vf scale=3840x2160 -b:v 18000k \
  -minrate 9000k -maxrate 26100k -tile-columns 3 -g 240 -threads 24 \
  -quality good -speed 4 -crf 15 -c:v libvpx-vp9 -c:a libopus \
  -pass 2 -y tos-3840x2160-50-60fps.webm