Hallo Zusammen,
in diesem Beitrag habe ich ein Script vorgestellt, mit dem die detektierten Fireballs der Meteorkamera-Software automatisch in eine mp4-Datei umgewandelt werden und
in Unterordnern mit Zeitstempel abgelegt werden.
Bisher hatte ich diese Dateien mit PIPP in ein animiertes gif umgewandelt (und auf 1024 Pixel Breite herunterskaliert).
Der Output ist gut und die Dateigröße ist akzeptabel (im Beispiel sind es 216,1kb):
Leider verweigert PIPP aus mir unbekannten Gründen bei ungefähr 50% der mp4-Dateien die Zusammenarbeit und spuckt eine Fehlermeldung aus.
Den "Rest" habe ich unter Linux dann immer mit "gifcurry" händisch (Datei für Datei) konvertiert.
Um meinen workflow ein bisschen zu automatisieren, habe Ich habe mich ein wenig mit ffmpeg beschäftigt.
Der standard-output des Befehls
ist über 7MB groß und hat eine schlechte Qualität:
Erst die Verwendung der ffmpeg-Option "paletteuse" bringt eine Verbesserung der Bildqualität.
ffmpeg -i test.mp4 -vf "fps=20,scale=1024:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=64:reserve_transparent=1[p];[s1][p]paletteuse" -loop 0 test4.gif
Die Datei ist - verglichen mit dem PIPP-Output - nur unwesentlich größer (360,1kb):
Wenn jemand weitere Ideen zur Dateigrößen-Reduzierung hat: immer her damit!
In diesem Zusammenhang sei erwähnt, dass ich z.B. gifsicle probiert habe, dass bringt aber nur wenige kb, wenn das Bild nicht schlechter werden soll.
Soweit zu meinen Ausflügen in die ffmpeg-Welt - jetzt zum Script.
Wir haben also einen Ordner auf dem Meteor-Pi mit den aktuellen mp4-Fireball-Dateien.
Ich empfehle dringend, diesen Ordner auf den Hauptrechner zu kopieren - der PI ist mit der Umwandlung mp4 zu gif schnell überfordert!
Das Shellscript macht folgendes:
1) es fragt nach dem Verzeichnis, in dem die mp4-Dateien liegen
2) es erzeugt ein Unterverzeichnis in diesem Ordner mit dem Namen "ani_gif"
3) es wandelt alle mp4-Dateien mit der oben beschriebenen Methode in gif Dateien um, dabei werden die gifs auf 1024 Pixel Breite skaliert
Hier das Script (muss natürlich wieder ausführbar gemacht werden und ffmpeg muss natürlich auch installiert sein):
#!/bin/bash
# Benutzer nach dem Verzeichnis fragen
read -p "Bitte geben Sie das Verzeichnis mit den MP4-Dateien ein: " input_directory
# Pfad zum Ausgabeordner für die GIFs
output_directory="$input_directory/ani_gif"
# Überprüfe, ob der Ausgabeordner existiert. Wenn nicht, lege ihn an.
if [ ! -d "$output_directory" ]; then
mkdir -p "$output_directory"
fi
# Finde den vollen Pfad zu ffmpeg
ffmpeg_path=$(which ffmpeg)
# Schleife durch die MP4-Dateien und erstelle GIFs
for mp4_file in "$input_directory"/*.mp4; do
if [ -e "$mp4_file" ]; then
mp4_filename=$(basename "$mp4_file")
gif_filename="${mp4_filename%.mp4}.gif"
output_path="$output_directory/$gif_filename"
# Verwende den vollen Pfad zu ffmpeg, um das GIF zu erstellen
"$ffmpeg_path" -i "$mp4_file" -vf "fps=25,scale=1024:-1:flags=lanczos,split[s0][s1];[s0]palettegen=max_colors=64:reserve_transparent=0[p];[s1][p]paletteuse" -loop 0 "$output_path"
echo "Das GIF $gif_filename wurde erfolgreich erstellt und in $output_directory verschoben."
else
echo "Keine MP4-Dateien im Verzeichnis gefunden."
break
fi
done
echo "Alle GIFs wurden erstellt und im Verzeichnis $output_directory gespeichert."
Alles anzeigen
Gruß, Jochen