[skript]Thumbnails aus Video Datei erstellen (libav+imagemagick)

montage
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

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert