Manchmal kann es interessant sein, eine Videodatei anhand einiger Ausschnitte zu bewerten.
Ob die Aufnahme komplett ist, also Anfang und Ende hat, oder eine komplette Fehlaufnahme war.
Mit avconv und imagick geht das ganz einfach.
Das folgende Skript nimmt als erstes Argument ein vdr-Verzeichnis oder eine Video-Datei. Das zweite Argument, „base64“, veranlasst das Skript dazu die Montage als base64 kodierten String auszugeben. Nützlich für ein vdr-Mail-Skript.
Aufgabe des Skriptes ist es, aus einer Video-Datei eine bestimmte Anzahl an Vorschaubildern zu generieren, gleichmässig verteilt über das gesamte Video. Am Anfang und am Ende wird ein Teil weggelassen, bei Aufnahmen ist dieser eh meist die Vortlaufzweit bzw. Nachlaufzeit.
Zuerst wird mittels avprobe die Gesamtspiellänge des Videos eingelesen. Dann werden ab einem bestimmten Zeitpunkt, standardmässig 5% der Speildauer, mit Hilfe von libav (avconv), Vorschaubilder erzeugt. Der zeitliche Abstand der Bilder wird errechnet um eine definierte Anzahl von Bildern, standardmässig 6, zu erhalten. Diese Bilder werden dann mit Hilfe von imagemagick in ein Bild zusammengefasst, jeweils mit einem Zeitstempel.
Zum erzeugen der Vorschaubilder wird nur eine einzige Sekunde des Filmmaterials verarbeitet, und dort ein iFrame herausgefiltert und benutzt. Dadurch ist die gesamte Verarbeitung angenehm schnell. Die eine Sekunde Verarbeitung ist notwendig, da es ansonsten passieren kann dass kein iFrame gefunden wird und ein graues Bild zurückgegeben wird.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | #!/bin/bash if [ -f "$1" ] then INPUT="$1" elif [ -d "$1" ] && [ -f "$1/00001.ts" ] then INPUT="$1/00001.ts" else echo Keine Datei gefunden exit 1 fi WORKDIR=$(mktemp -d) cd $WORKDIR seconds=$(avprobe $INPUT 2>&1 | awk 'BEGIN { FS = "[[:space:].,:]" } /Duration/ {print $5*60*60+$6*60+$7}') ########################### DBG="${DBG:-:}" THUMBS="${THUMBS:-6}" SKIP="${SKIP:-$((seconds/20))}" ########################## $DBG Dauer: $seconds $DBG Ueberspringe: $SKIP remain=$(($seconds-2*$SKIP)) $DBG Verbleibend: $remain step=$(($remain/THUMBS)) $DBG Spruenge: $step frame=$SKIP count=0 while [ $frame -lt $seconds ] && [ $count -lt $THUMBS ] do $DBG Thumbnail bei $frame avconv -loglevel fatal -ss $frame -i $INPUT -ss 1 -vf select="eq(pict_type\,I)" -vframes 1 thumb_$frame.jpg CMDLINE="$CMDLINE -label $(date -d @$(($frame - 3600)) +"%H:%M:%S") thumb_$frame.jpg" let "frame = frame + $step" let count++ done montage $CMDLINE -geometry +1+1 -thumbnail 300x300 thumbnails.jpg if [ "$2" == "base64" ] then base64 thumbnails.jpg cd - rm -f $WORKDIR/*.jpg rmdir $WORKDIR else echo $WORKDIR fi |