Benutzer-Werkzeuge

Webseiten-Werkzeuge


av1

Dies ist eine alte Version des Dokuments!


AV1

Encoder

Encoder-Vergleich

# Dieser Verglich wurde auf FreeBSD 14.0, im Februar 2024, gefahren.

### AOM-AV1 (FreeBSD 14.0)
# optimiert, um Platz zu sparen
# 417 MB (ca. 30% Platzersparnis gegenüber dem SVT-AV1)
# 3707 Minuten Kompilierzeit (mehr als 12-mal so lange, wie der SVT-AV1)
ffmpeg ... -c:v libaom-av1 -cpu-used 3 -crf 28 -aom-params fp-mt=1 -row-mt 1 -aq-mode 1 -tune 1 -threads 6

### SVT-AV1 (FreeBSD 14.0)
# optimale Balance zwischen Qualität, Kompilierzeit und Dateigröße
# 588 MB
# 308,5 Minuten Kompilierzeit
ffmpeg ... -c:v libsvtav1 -crf 29 -preset 5 -svtav1-params enable-overlays=1:enable-tf=0:film-grain=0:film-grain-denoise=0:keyint=5s:scd=1:tune=0:fast-decode=0
### SVT-AV1 (FreeBSD 13.2)
ffmpeg ... -c:v libsvtav1 -crf 25 -preset 7 ...:  902 MB (96 %)

### SVT-AV1 (FreeBSD 14.0)
ffmpeg ... -c:v libsvtav1 -crf 25 -preset 7 ...:  940 MB (100 %)
ffmpeg ... -c:v libsvtav1 -crf 20 -preset 5 ...: 1226 MB (130 %)
ffmpeg ... -c:v libsvtav1 -crf 25 -preset 5 ...:  853 MB (91 %)
ffmpeg ... -c:v libsvtav1 -crf 26 -preset 5 ...:  771 MB (82 %)
ffmpeg ... -c:v libsvtav1 -crf 27 -preset 5 ...:  701 MB (75 %)
ffmpeg ... -c:v libsvtav1 -crf 28 -preset 5 ...:  640 MB (68 %)
ffmpeg ... -c:v libsvtav1 -crf 29 -preset 5 ...:  588 MB (63 %)
ffmpeg ... -c:v libsvtav1 -crf 30 -preset 5 ...:  545 MB (58 %)

Encoder: libaom-av1

> ffmpeg -help encoder=libaom-av1

libaom-av1 ist seit dem 23. Sep. 2020 nicht mehr experimentell

ffmpeg -h encoder=libaom-av1
ffmpeg -i input.mp4 -c:v libaom-av1 -crf 20 -b:v 0 -cpu-used 5 -row-mt 1 -tile-columns 1 -tile-rows 0 -f matroska ausgabe.mkv

Lossless encoding

  • -crf 0 -aom-params lossless=1

Kodiergeschwindigkeit

  • für die Transkodiergeschwindigkeit sind hauptsächlich die folgenden Option verantwortlich
    • -crf verschiebt das Verhältnis zwischen Dateigröße und Kodiergeschwindigkeit
      • -crf 32 dürfte sich (von der Dateigröße her) ungefähr im Bereich von VP9 bewegen, wie ich es nutze
    • -cpu-used macht eine Menge aus
      • damit soll das Verhältnis zwischen Qualität und Kodiergeschwindigkeit verschoben werden können;
      • 0 ist am langsamsten
      • 1 ist Standard
      • 8 ist am schnellsten
    • -usage schaltet die Prio entweder auf Qualität (Standard) oder auf Kodiergeschwindigkeit, besser streamen zu können
      • -usage 0 - gute Qualität aber sehr langsam
      • -usage 1 - für streaming/realtime, ist fast so schnell wie VP9
    • -aq-mode 3 bremst den Kodec sehr stark ein
      • setzt man da einen Werte zwischen "0" und "2", dann macht das fast nix in der Geschwindigkeit

Geschwindigkeits- und Qualitätsbeeinflussung

Standard-Aufrufe

langsam mit hoher Qualität (-crf 20 -usage 0 -cpu-used 0):

> ffmpeg -i film.avi -probesize 9223372036854M -analyzeduration 9223372036854M -fflags +genpts -i film.avi -c:v libaom-av1 -crf 20 -usage 0 -cpu-used 0  -map 0:v -c:a libvorbis -q:a 6 -map 0:a:0 -c:s copy -f matroska -y film.mkv

schnell mit geringer Qualität (-crf 50 -usage 1 -cpu-used 8 -threads 0 -tile-columns 1 -tile-rows 0 -row-mt true):

> ffmpeg -i film.avi -probesize 9223372036854M -analyzeduration 9223372036854M -fflags +genpts -i film.avi -c:v libaom-av1 -crf 35 -usage 1 -cpu-used 8 -threads 0 -tile-columns 1 -tile-rows 0 -row-mt true -map 0:v -c:a libvorbis -q:a 6 -map 0:a:0 -sn -f webm -y film.webm
  • -cpu-used sets how efficient the compression will be. Default is 1. Lower values mean slower encoding with better quality, and vice-versa. ⇒ 0…8
  • -row-mt 1 enables row-based multi-threading which maximizes CPU usage. To enable fast decoding performance, also add tiles (i.e. -tiles 4x1 or -tiles 2x2 for 4 tiles). Enabling row-mt is only faster when the CPU has more threads than the number of encoded tiles.
  • -usage realtime für Video-Konferenzen

HDR - Farbinformationen

  • When encoding in HDR it's necessary to pass through color information; -colorspace, -color_trc and -color_primaries.
  • For example, Youtube HDR uses: -colorspace bt2020nc -color_trc smpte2084 -color_primaries bt2020
> ffmpeg -h encoder=libaom-av1
> ffmpeg -i input.mp4 -c:v libaom-av1 -crf 20 -b:v 0 -cpu-used 4 -threads 4 -row-mt 1 -tile-columns 1 -tile-rows 0 -colorspace bt2020nc -color_trc smpte2084 -color_primaries bt2020 -c:a libopus -vbr on -compression_level 10 -ac 2 -b:a 200k -f matroska -y av1_test.mkv

Good News: AV1 Encoding Times Drop to Near-Reasonable Levels

During the recent project, I asked Google if there were any other ways to accelerate encoding speed.

One engineer advised:

If you can use multiple threads while running the encoder, it would help with the encoder speed.
For HD and above resolutions, we suggest using tiles.
Using tiles causes quality loss, and my old testing showed ~0.6% loss while using 2 tiles and ~1.3% loss while using 4 tiles.

I didn't test 4k clips myself, so here I just give some suggestions.
For 1080p, use 2 tiles and 8 threads: "--tile-columns=1 --tile-rows=0 --threads=8

For 4k, use 4 tiles and 16 threads: "--tile-columns=1 --tile-rows=1 --threads=16" (or even try: 8 tiles/32 threads: "--tile-columns=2 --tile-rows=1 --threads=32")"

um eine hohe Qualität und eine hohe Kompatibilität zu erhalten, behalte ich diese Werte wie folgt immer bei:

für gleichbleibende Qualität: -b:v 0 -row-mt 1 -tile-columns 1 -tile-rows 0
für HDR wie YouTube es einsetzt (hohe Kompatibilität): -colorspace bt2020nc -color_trc smpte2084 -color_primaries bt2020

um die Qualität und Kodiergeschwindigkeit steuern zu können, werden diese Werte individuell angepasst

soviel Qualität wie nötig (meine höchste Qualität: ~"16" / meine höchste Geschwindigkeit: ~"36"): -crf 20
für maximale Kodiergeschwindigkeit, hier die Anzahl der "echten" Kerne ("4" für 4 Kerne bzw. 8 HyperThreading): -cpu-used 4 -threads 4

Anzahl der "echten" CPU-Kerne mit FreeBSD ermitteln:

# sysctl -n hw.ncpu
4

# sysctl -n kern.smp.cpus
4

Anzahl der "echten" CPU-Kerne mit Linux ermitteln:

# egrep '^core id' /proc/cpuinfo | sort -u | wc -l
4

Encoder: librav1e

ffmpeg -h encoder=librav1e
ffmpeg -i input.mp4 -c:v librav1e -qp 80 -tile-columns 1 -tile-rows 0 -rav1e-params speed=5:low_latency=true -f matroska ausgabe.mkv

Encoder: libsvt_av1

> ffmpeg -help encoder=libsvtav1
> ffmpeg -i input.mp4 -c:v libsvtav1 -crf 35 svtav1_test.mp4
> ffmpeg -h encoder=libsvt_av1
> ffmpeg -i input.mp4 -c:v libsvt_av1 -qp 32 -preset 8 -profile 0 -level 0 -rc 0 -f matroska ausgabe.mkv

Für den Codec "SVT-AV1" sind die Optionen -crf 25 -preset 7 recht praktisch. Sinnvolle Werte für -preset liegen zwischen "3" und "8".

#  -preset     "-1 bis 13" (default 10) Kompromiss zwischen Codierungsgeschwindigkeit und Komprimierungseffizienz
                                        Niedrigere Werte führen bei einer gegebenen Dateigröße zu einer Ausgabe mit besserer Qualität,
                                        die Codierung dauert jedoch länger.
#  -crf         "0 bis 63" (default 50) Constant Rate Factor: Niedrigere Werte entsprechen einer höheren Qualität und einer größeren Dateigröße.

Encoder: av1 (ffmpeg intern)

ffmpeg -i input.mp4 -c:v av1 -crf 32 -f matroska ausgabe.mkv

Player

/home/http/wiki/data/attic/av1.1709073867.txt · Zuletzt geändert: von manfred