Komprimierung von Videos in Goobi workflow für Anzeige im Goobi viewer

Hallo in die Runde,

bei TIFF-Dateien übernimmt in Goobi workflow zB GraphicsMagick die Umwandlung der Masterdateien in webtaugliche JPG-Dateien. Funktioniert etwas ähnliches auch bei MP4-Videos? Unsere Masterdateien sind in 8K/4K ca. 20 GB groß, damit also untauglich für die Anzeige im Browser. Im Moment erzeuge ich aus den Mastern manuell die Derivate, diesen Schritt würde ich gerne automatisieren.

Liebe Grüße, Andreas

Ich glaub, ffmpeg kann ziemlich viel in die Richtung. Hab es aber selber noch nicht ausprobiert. Das sollte sich aber automatisieren lassen.

1 Like

Vielen Dank @Georg. @Intranda, ließe sich ffmpeg in Goobi einbinden?

Ich bin zwar nicht Intranda, aber ffmpeg lässt sich wie GraphicsMagick von der Kommandozeile aus aufrufen, könnte also genauso wie jenes per Scriptschritt eingebunden werden. Denke ich.

2 Likes

Auch nicht Intranda aber habe mich schon mal mit FFMPEG privat beschäftigt und das funktioniert problemlos.

Bei uns in der Bibliothek verwenden wir einen automatischen Schritt mit mehrern Skript-Schritten zur Erstellung der TIFF deriviate, eine leicht abgewandelte Version sollte für das ausreichen.

Beispiel in Produktionsvorlage:

Da Goobi nur den Pfad zum Ordner hat brauchen wir ein Wrapper-Skript, wie iii.sh, welches FFMPEG einzeln mit jedem in dem Ordner liegendem Video aufruft.

Hier ist ein primitiver selbstgeschriebener Wrapper:
#!/bin/bash

video_files="$(find "$1" -type f -exec file -N -i -- {} + | sed -n 's!: video/[^:]*$!!p')"
#Siehe https://askubuntu.com/a/844720

if [ -z "$video_files" ]; then
  echo "Keine Videodateien gefunden!"
  exit 2
fi

printf "$video_files\n"| while read line ; do
  if [[ $line == *"_converted."* ]]; then
    continue #Wenn _converted. im Namen ist wird das Video nicht verarbeitet!
  fi
  #echo "Now processing: $line"
  /pfad/zu/gültigem/bin/ffmpeg -i "$line" -c:v libx264 -preset medium -vf "scale=-2:min'(720,ih)'" -crf 25 -fpsmax 30 -acodec aac -threads $((`nproc --all` / 2))  -loglevel fatal -nostdin -y "${line%.*}_converted.${line##*.}"
done

#Erklärung von FFMPEG Parametern:
#-i "$line" = Welche Datei konvertiert werden soll.

#-c:v libx264 = Gibt an den H.264 codec zu verwenden.

#-preset medium = Je langsamer desto besser wird die Qualität und kleiner die Datei, braucht aber auch länger zum verarbeiten.
#Je nachdem wie sehr man den Server auslasten kann, kann man zwischen ‘ultrafast’ ‘superfast’ ‘veryfast’ ‘faster’ ‘fast’ ‘medium’ ‘slow’ ‘slower’ ‘veryslow’ entscheiden.
#Siehe http://trac.ffmpeg.org/wiki/Encode/H.264#Preset

#-vf "scale=-2:min'(720,ih)'" = Wenn die Auflösung größer als X:720 ist wird das Video auf X:720 heruntergerechnet, wenn es kleiner ist bleibt es kleiner. Siehe https://stackoverflow.com/a/40497904

#-crf 25 = Gibt die zu erzielende Qualität vor, empfohlen werden 17–28.
#17 ist visuell verlustfrei, 23 ist Standard und über 28 ist extremst verlustbehaftet. Siehe http://trac.ffmpeg.org/wiki/Encode/H.264#a1.ChooseaCRFvalue

#-fpsmax 30 = Beschränkt die Bilder/Sekunde auf 30, sollte für die meisten Sachen ausreichen und spart einiges an Platz.

#-acodec aac = Konvertiert Audio zu AAC, kann durch -a:c copy ersetzt werden um die Audio ohne weiterer Kompression zu kopieren.

#-threads $((`nproc --all` / 2)) = Nutze nur die Hälfte der verfügbaren CPU-Kerne um eine komplette Auslastung zu verhindern, sollte an den Server angepasst werden.

#-loglevel fatal = Keine Ausgabe in die Konsole außer fatalen Fehlern die zum Absturz führen.

#-nostdin -y = Wenn die Zieldatei bereits existiert wird diese ohne zu fragen überschrieben.

#"${line%.*}_converted.${line##*.}" = Legt die Zieldatei fest und fügt _converted zu dem Dateinamen hinzu.

Dieses Wrapper-Skript kann, nachdem der Pfad zu einer ffmpeg-binary eingesetzt wurde (z.B. /usr/local/bin/ffmpeg), durch einen Skript-Schritt mit z.B. folgendem Befehl ausgeführt werden:

/bin/bash /opt/digiverso/goobi/scripts/ffmpeg_convert.sh {origpath}

Wenn das Original nicht in {origpath} liegt muss die Variable natürlich durch die richtige ersetzt werden.
Für die Ausgabe könnte der Wrapper umgeschrieben werden dass in einen anderen Ordner, z.B. {tifpath} geschrieben wird, je nachdem wie Goobi Workflow/Viewer eingerichted sind.
Ebenso ließe es sich leicht erweitern sodass verschiedene Optionen von FFMPEG im Skript-Schritt einstellbar sind, z.B. Bildrate, maximale Auflösung, etc.


Ich habe es nicht in Goobi getestet, nur außerhalb, ich hoffe das hilft mal weiter :​)
LG Leo

2 Likes

Hallo Leo,

vielen Dank, das hilft mir sehr. Wir werden das bei uns mal so implementieren lassen.

Liebe Grüße, Andreas

Hallo @florian.alpers,

habt ihr Erfahrung mit FFMPEG in Goobi? Oder nutzt ihr etwas vergleichbares?

Viele Grüße, Andreas

Hallo Andreas,

ich sammele gerade Erfahrungen damit bei einem anderen Kunden. Das nutzen wir dort zur Konvertierung zwischen Video- und Audioformaten. Läuft aber noch nicht mit allen Medien rund.

1 Like

Hallo @florian.alpers, wenn Ihr noch Anwender zum Testen sucht: Wir hätten Interesse.