ffmpeg-4 und libaom-av1

Liebe Community!

Ich möchte gern endlich den av1 codec (encode) in ffmpeg zum laufen kriegen. Meine Version ist 4.4, aktuell , von Packman:

Version in zypper:

Informationen zu Paket ffmpeg-4:

Repository : Packman_15.3
Name : ffmpeg-4
Version : 4.4-pm153.2.9
Arch : x86_64
Anbieter : http://packman.links2linux.de
Installierte Größe : 2,2 MiB
Installiert : Ja
Status : aktuell

ffmpeg version 4.4 Copyright (c) 2000-2021 the FFmpeg developersbuilt with gcc 7 (SUSE Linux)
configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --incdir=/usr/include/ffmpeg --extra-cflags=‘-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -g’ --optflags=‘-fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector-strong -funwind-tables -fasynchronous-unwind-tables -fstack-clash-protection -g’ --disable-htmlpages --enable-pic --disable-stripping --enable-shared --disable-static --enable-gpl --enable-version3 --disable-openssl --enable-avresample --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcelt --enable-libcdio --enable-libdav1d --enable-libdc1394 --enable-libdrm --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libv4l2 --enable-libvpx --enable-libwebp --enable-libxml2 --enable-libzimg --enable-libzvbi --enable-libmfx --enable-vaapi --enable-vdpau --enable-version3 --enable-libfdk-aac-dlopen --enable-nonfree --enable-libvo-amrwbenc --enable-libx264 --enable-libx265 --enable-librtmp --enable-libxvid
libavutil 56. 70.100 / 56. 70.100
libavcodec 58.134.100 / 58.134.100
libavformat 58. 76.100 / 58. 76.100
libavdevice 58. 13.100 / 58. 13.100
libavfilter 7.110.100 / 7.110.100
libavresample 4. 0. 0 / 4. 0. 0
libswscale 5. 9.100 / 5. 9.100
libswresample 3. 9.100 / 3. 9.100
libpostproc 55. 9.100 / 55. 9.100

Dort gibt es kein --enable-“libaom” oder “libaom3” oder “libaom-av1”.
Ich habe libaom0 und libaom3 beides installiert.
Aber es meldet “codec not recognised”, was ja auch klar ist, da es in ffmpeg nicht einkompiliert ist, wenn ich das richtig verstehe.

Hat jemand für Leap15.3 ein Paket gefunden, das libaom mit av1 einschließt?
Bitte schreibt mir, wo ich es finden kann.

Was ich nicht möchte:

  • ffmpeg selber kompilieren (sehr aufwändig)
  • zu Tumbleweed oder Leap15.4 Alpha wechseln
  • andere transcoder als ffmpeg nehmen, da ich Skripte habe, die auf ffmpeg basieren

Wenn ihr ein Lösung habt, bitte schreibt mir doch mit einem Tip

Danke!
Euer Cellocommander

Hast du mal versucht, den OBS zu benutzen???

Zum AV1-Encoder in ffmpeg siehe:
https://trac.ffmpeg.org/wiki/Encode/AV1

Der einzige richtige und wahre Weg ist der folgende:

RPMS von ffmpeg aus einer seriösen und vertrauenswürdigen Quelle herunterladen. Bei SLED erfolgt dies per:

Im YAST die Source-Quelle “SLE-Module-Desktop-Applications-Source-Pool” aktivieren.

zypper source-download --no-delete --directory /tmp

Dann ffmpeg.spec, enable_encoders und enable_decoders aus dem neuen ffmpeg-RPMS entpacken und entsprechend “frisieren”.

**Warnung: Vorgängig müssen die allenfalls erforderlichen Lizenzgebühren für die neu eingeschalteten Encoders oder Dekoders bezahlt werden!

**Das “Frisieren” für das Einschalten vom AAC- und H.264-Dekoder sieht wie folgt aus:

Zwei Zeilen hinzufügen zu to /usr/src/packages/SOURCES/enable_decoders:

aac # enable AAC decoder - license fees may apply
h264 # enable H.264/AVC decoder - license fees may apply

/usr/src/packages/SOURCES/ffmpeg.spec modifizieren

1.) Alle Zeilen editieren:
Alt:
This build of ffmpeg is limited in the number of codecs supported.

Neu:
Special version - with H.264/AVC decoder and AAC decoder - license fees may apply.

2.) Zeilen entfernen:
BuildRequires: ladspa-devel
BuildRequires: pkgconfig(liboil-0.3) >= 0.3.15
BuildRequires: pkgconfig(zvbi-0.2)

–enable-ladspa \
–enable-libzvbi \

3.) Zeilen editieren:

Alt:
–disable-decoder=mpeg4,h263,h264,hevc,vc1 \

Neu:
–disable-decoder=mpeg4,h263,hevc,vc1 \

Alt:
for i in MPEG4 H263 H264 HEVC VC1; do

Neu:
for i in MPEG4 H263 HEVC VC1; do

ffmpeg-RPMS in /usr/src/packages/source entpacken.

“Frisiertes” ffmpeg.spec, enable_encoders und enable_decoders ins Verzeichnis
/usr/src/packages/source kopieren.

zypper install rpm-build

su

mkdir /usr/src/packages/tmp

export TMPDIR=/usr/src/packages/tmp

cd /usr/src/packages/SOURCES

rpmbuild -ba --clean ffmpeg.spec

Zum Abschluss sollte das neue RPM und RPMS noch signiert werden:

man rpmsign

GPG-Schlüssel für die RPM-Signieren installieren:

su

yast2 repositories

=> Knopf “gpg key”
=> Knopf “add”

RPM signieren:

rpm --addsign /usr/src/packages/RPMS/x86_64/libavcodec57-3.4.2-4.27.1.x86_64.rpm

rpm --addsign /usr/src/packages/RPMS/x86_64/libavformat57-3.4.2-4.27.1.x86_64.rpm

rpm --addsign /usr/src/packages/SRPMS/ffmpeg-3.4.2-4.27.1.src.rpm

RPM-Signaturen kontrollieren:

rpm --checksig /usr/src/packages/RPMS/x86_64/libavcodec57-3.4.2-4.27.1.x86_64.rpm

=> libavcodec57-3.4.2-4.27.1.x86_64.rpm: digests signatures OK

rpm --checksig /usr/src/packages/RPMS/x86_64/libavformat57-3.4.2-4.27.1.x86_64.rpm

=> libavformat57-3.4.2-4.27.1.x86_64.rpm: digests signatures OK

rpm --checksig /usr/src/packages/SRPMS/ffmpeg-3.4.2-4.27.1.src.rpm

=> ffmpeg-3.4.2-4.27.1.src.rpm: digests signatures OK

Installation der neuen RPM’s:

zypper install /usr/src/packages/RPMS/x86_64/libavcodec57-3.4.2-4.27.1.x86_64.rpm

zypper install /usr/src/packages/RPMS/x86_64/libavformat57-3.4.2-4.27.1.x86_64.rpm

rpm --verify libavcodec57

rpm --verify libavformat57

rpm --query --info libavcodec57

=> Special version - with H.264/AVC decoder and AAC decoder - license fees may apply.

rpm --query --info libavformat57

=> Special version - with H.264/AVC decoder and AAC decoder - license fees may apply.

Vor dem Einsatz eines AV1-Kodierer oder AV1-Dekodierer sollte sichergestellt werden, dass Hardware und Software hardwarebeschleunigte Dekodierung und Kodierung von diesem “Videoformat” unterstützt.

=> Der Einsatz von modernen “Videoformate” wie VP8, VP9, H.264/AVC, H.265/HEVC oder AV1 OHNE entsprechend funktionsfähige Hardwarebeschleunigung kann ich NICHT empfehlen!

Als Einstieg in das Thema “Hardwarebeschleunigte Dekodierung von Videos” empfehle ich das Lesen von:
https://wiki.archlinux.org/title/Hardware_video_acceleration

https://mastransky.wordpress.com/2020/06/03/firefox-on-fedora-finally-gets-va-api-on-wayland/

https://linuxreviews.org/HOWTO_Make_Mozilla_Firefox_Blazing_Fast_On_Linux

Beim Einsatz von INTEL-Grafikkarten (oder INTEL SoC) kann mit:

sudo intel-gpu-top

kontrolliert werden, ob das hardwarebeschleunigte Dekodieren und Kodieren von Videos funktioniert. Intel-gpu-top ist bei SLED im RPM “intel-gpu-tools” enthalten.

Danke Sauerland, nein, habe ich noch nie probiert. Wie macht man das?
Ich habe bisher immer repositories eingebunden und Pakete daraus installiert.
Ich suche das mal, aber wenn du mir einen Link für eine brauchbare Anleitung posten könntest…

Ich versuche das erstmal mit dem Build Service, und wenn ich das nicht hinbekomme, dann melde ich mich nochmal hier und probiere die anderen Lösungen. Wie schon erwähnt, das eigene Kompilieren und Ändern von .spec Dateien finde ich eher aufwändig, und würde zunächst gern auf vorkompilierte Dateien oder etablierte Buildsysteme zurückgreifen.
Ich habe erst wenige Male etwas kompiliert, und bin meistens auf unerwartete Probleme gestoßen, wo man dann erst ganze Bücher mit Anleitungen studieren muss, um sich in die Build-Philosophie einzuarbeiten. Bei der hohen Fluktuation von Software und ständigen Änderungen lohnt sich das für jemanden wie mich nicht wirklich.

Danke erstmal, Community!

Also, ok, ich hab mir mal die Anleitung zum OBS angesehen. Das ist die Introduktion zum versionsbasierten Kompilieren und Aktualisieren von Paketen in ganzen Projekten. Ich kann verstehen, dass die Community sagt, “Hey, wenn du Software willst, erstelle sie doch selbst”.
Aber ich bin Anfänger und ffmpeg ist kein triviales Programm, und ich würde es bevorzugen, die bereits geleistet Arbeit mitzubenutzen, bevor ich 2 Wochen lang irgendwas lerne und es dann doch nicht hinbekomme.

So, habe mir auch nochmal die Versionen auf software.opensuse.org angeschaut und festgestellt, dass die Version in multimedia:libs doch libaom_av1, aber dafür kein dekodieren von h264 mehr anbietet. Wieso? Das ging doch bisher auch. Wir müssen das doch unterstützen, denn das Meiste kommt in h264 daher, zB von Kameras, oder die Filme usw.

Gibt es die Möglichkeit h264 UND av1 in ffmpeg vorkompiliert zu haben?

Ich kapier das nicht: habe eben das konvertieren von vp9 nach libaom_av1 versucht.

Meldung:

Unknown encoder 'libaom_av1'

Aber beim Aufruf von ffmpeg-4 steht oben

--enable-encoder=',aac,apng,ass,ayuv,bmp,ffv1,ffvhuff,flac,gif,huffyuv,jpegls,libaom,libaom_av1, ...

usw
Zypper meldet aktuell:

Installierte Pakete werden gelesen...

S  | Name               | Summary                                            | Type
---+--------------------+----------------------------------------------------+-----------
   | libaom             | AV1 codec library                                  | Quellpaket
   | libaom-debugsource | Debug sources for package libaom                   | Paket
   | libaom-devel       | Development files for libaom, an AV1 codec library | Paket
   | libaom-devel-doc   | Documentation for the libaom API                   | Paket
i+ | libaom0            | AV1 codec library                                  | Paket
   | libaom0-32bit      | AV1 codec library                                  | Paket
i+ | libaom3            | AV1 codec library                                  | Paket
   | libaom3-debuginfo  | Debug information for package libaom3              | Paket

Wer kann mir das erklären?

Ich habe obenstehendes nicht vollständig verfolgt. Verstehe aber das es um Multomedia geht. Ich have auch gesehen das Packman erwäht worden ist.

Ist es schon 1000% sicher das das umschalten nach Packman richtig gemacht worden ist? Es kann nicht schaden das nochmahls zu machen.

Das Installieren der Pakete ist kein Problem. Das macht “sudo zypper install [paket]” mit Abhängigkeiten richtig. ffmpeg-4 ist auch installiert. Aber die Version auf “multimedia:libs” Repo hat kein h264dec. Ich frage warum, wenn die Version von “Packman all” das hat.

Und wie ich schrieb, hat die aktuelle Version die option aktiviert, findet aber die Library offensichtlich nicht, obwohl sie angeblich installiert ist (s.o.).

Nochmal. Ich habe nicht alles oben gelesen. Aber deine Antwort ist für micht nicht befriedigend.

Ich verstehe schon das man ein Paket mit zypper install installiert. Es geht aber darum: von wo?
Die Multimedia Paketen von OSS (vielleicht auch von multimedia:libs) sind verkrüpelt wgen Lizenzen. Dafür gibt es Packman. Und wenn es eine Packman Version gibt von ein Paket sollte man das bevorzügen über das gleichnamige OSS Paket.

Und das erreicht man am leichtetsten durch den “Switch to Packman”.

Gestern noch hat einer das nicht kapiert und immer gesagt : “aber ich habe die Packman repo doch”. Das nutzt aber nichts wenn er nicht benutzt wird. Nachden er dann endlich den Switch gemacht hat war sein Problem weg.
Nicht der erste Fall in soviele Jahre.

Ja, du hast teilweise recht, Packman hat h264, multimedia:libs scheinbar nicht.
Meine Probleme sind aber damit nicht gelöst:

  1. Packman ffmpeg-4 hat h264 (dec+enc) (angeblich), aber kein av1 (enc), und bei multimedia:libs ist es genau anders herum. → Back to square 1,
    s. Post 11:44
  2. Die Version von multimedia:libs hat angeblich av1, aber beim Versuch es zu benutzen gibt es einen Fehler (s. Post 12:13)

multimedia:libs und Packman gleichzeitig ergibt immer Probleme.

multimedia:libs ist auch nur die Entwicklung für openSUSE, dort sollten keine propieritären Codecs eingebaut sein…
Das ergäbe grundsätzlich Probleme, da dann auf Hardware von openSUSE so etwas gebaut wird und openSUSE damit angreifbar wäre.

Ich musste auch schon 1 Paket löschen…

Ich muss mich noch ergänzen: Ich habe momentan wieder die Packmanversion von ffmpeg-4 installiert. Es gibt dort support für av1, aber nur decode:

D.V.L. av1                  Alliance for Open Media AV1 (decoders: libdav1d av1 av1_qsv)

Da fehlt das “E”. Also kann ich damit nichts anfangen :seufz: Wenn jemand ein Lösung hat, bitte posten. Danke! Ich werde mir das mit dem Kompilieren nicht geben. Momentan ist dafür keine Zeit. Vielleicht hilft ja Leap 15.4 wenn es fertig ist.

Leap 15.4 wird mit demselben spec gebaut…
Du kannst nur eine feature request bei Packman einreichen…

Ich deute dies aber als nicht eingebaut:

%if 0%{?suse_version} > 1500
%bcond_without libaom
%bcond_without mysofa
%bcond_without vidstab
%bcond_without srt
%bcond_without codec2
%bcond_without lv2
%bcond_without librav1e
%bcond_without rubberband
%bcond_without soxr
%bcond_without zmq
%bcond_without vulkan

https://pmbs.links2linux.de/package/view_file/home:davepl/ffmpeg-4/ffmpeg-4.spec?expand=1

Hallo Cellocommander,

ich habe in YaST einfach mal nach AV1 gesucht, da finde ich aom-tools, darin enthalten “aomenc”. Wenn ich die Ente frage, scheint es ein AV1-Encoder zu sein. Ich weiß nicht, ob es Dir hilft. Einen Versuch wäre es wert.

Ja danke! kasi042
Ich probiere das mal aus.

Ergänzend zu meinen beiden Beiträgen vom 05.03.2022 hier die aktualisierte Anleitung zum Bau des “frisierten” RPM libavcodec58_134 und libavformat58_76 unter SUSE Linux Enterprise Desktop 15 SP4 (SLED15 SP4). Diese Anleitung sollte auch unter OpenSUSE Leap 15.4 funktionieren (ungetestet).

Unter SLED15 SP4 funktioniert erstmalig im Webbrowser Firefox ESR 102 die “Hardwarebeschleunigte Dekodierung von Videos” per VA-API (Intel GPU). Die “Videoformate” H.264/AVC und VP9 werden gemäss intel_gpu_top Zeile “Video/0” beim Abspielen im Webbrowser Firefox ESR 102 hardwaremässig beschleunigt. Getestet wurde mit den Testvideos erhältlich auf der Webseite:

https://tools.woolyss.com/html5-audio-video-tester/

Spezialanleitung RPM ffmpeg erstellen
================================================================================

# => Normale Befehlseingabe mit root-Rechten
$ => Befehlseingabe mit root-Rechten in der chroot-Umgebung


Im YAST alle Source-Quellen (source repositories) aktivieren.

# rm -R /var/mail/jail
# mkdir /var/mail/jail

Eine RAM-Disk für den Bau des RPM erstellen. Diese RAM-Disk sollte nur auf 
Rechnern mit mindestens 4 GB RAM erstellt werden!

# mount -t tmpfs tmpfs -o nosuid,nodev,noatime,nodiratime /var/mail/jail/

# mount --bind /dev /var/mail/jail/dev/
# mount --bind /proc /var/mail/jail/proc/
# mount --bind /sys /var/mail/jail/sys/

# rpm --root /var/mail/jail --import /usr/lib/rpm/gnupg/keys/*.asc
# zypper --installroot /var/mail/jail/ install patterns-base-minimal_base

# zypper --installroot /var/mail/jail/ install perl
# zypper --installroot /var/mail/jail/ install rpmbuild

# zypper --installroot /var/mail/jail/ source-install ffmpeg-4
=> Allfällige Fragen zu Abhängigkeiten mit der Taste "2" beantworten!

Ins Verzeichnis /var/mail/jail/usr/src/packages/SOURCES wechseln und die Dateien
ffmpeg-4.spec und enable_decoders ins Verzeichnis:

/home/Installation/SLED15/RPM/ffmpeg

kopieren.

ffmpeg-4.spec und enable_decoders "frisieren":

Folgende Zeile in enable_decoders ergänzen:

h264 # enable H.264/AVC decoder - license fees may apply


ffmpeg-4.spec wie folgt modifizieren:

Alle Zeilen:

This build of ffmpeg is limited in the number of codecs supported.

durch:

Special version - with H.264/AVC decoder - license fees may apply.

ersetzen.

Alle Zeilen mit:

ladspa
libbs2b
libmfx
liboil
libvmaf
zimg
zvbi

löschen. Zu diesen Bibliotheken fehlen die entsprechenden devel-RPM's. Diese
devel-RPM's sind nicht im Lieferumfang von SUSE Linux Enterprise Desktop (SLED).

"h264" respektive "H264" aus folgenden Zeilen löschen:

--disable-decoder=mpeg4,h263,h264,hevc,vc1 \

for i in MPEG4 H263 H264 HEVC VC1; do

Die "frisierte" enable_decoders ins Verzeichnis:

/var/mail/jail/usr/src/packages/SOURCES

kopieren.

Die "frisierte" ffmpeg-4.spec ins Verzeichnis:

/var/mail/jail/usr/src/packages/SPECS

kopieren.

# chroot /var/mail/jail

$ cd /usr/src/packages/SPECS/
$ rpmbuild -ba --clean ffmpeg-4.spec &> /tmp/build.log

Chroot-Umgebung verlassen:

$ exit

Im YAST alle Source-Quellen (source repositories) deaktivieren.

Weitere Schritte gemäss dem üblichen Vorgehen.

Weitere Schritte bei der Installationskontrolle:

# rpm --query --info libavcodec58_134
=> Special version - with H.264/AVC decoder and AAC decoder - license fees may apply.

# rpm --query --info libavformat58_76
=> Special version - with H.264/AVC decoder and AAC decoder - license fees may apply.

# umount /var/mail/jail/dev/
# umount /var/mail/jail/proc/
# umount /var/mail/jail/sys/

# umount /var/mail/jail
# rm -R /var/mail/jail

Wenn im Webbrowser Firefox ESR 102 die Konfiguration “media.ffmpeg.vaapi.enabled:=true” gesetzt ist (unter der internen Webseite: about:config), stehen die Chancen gut, dass der Webbrowser Firefox die Videodekodierung über ffmpeg/VA-API an die Intel GPU auslagert. Diese Firefox-Konfiguration war die einzige, welche ich unter SUSE Linux Enterprise Desktop 15 SP4 im WAYLAND-Betrieb mit Firefox ESR 102.6, ffmpeg 4.4, libva2 2.13 und intel-vaapi-driver 2.4.1 umstellen musste.