Mittlerweile besteht meine Fotosammlung aus ca 22.000 Dateien mit einer Gesamtgröße von fast 100GB. Höchste Zeit mir ein paar Gedanken zur Verwaltung sowie Backups zu machen. Das wichtigste ist meiner Meinung nach eine gute Ordnung, mit der man die Fotos später auch wiederfindet. Ich habe mir mittlerweile folgende Ordnerstruktur überlegt:
fotos/yyyy/yyyy-mm-dd_beschreibung
Beispiel:
fotos/2011/2011-04-21_Stadtpark
Für die Dateien im RAW-Format meiner alten Canon EOS 1000D oder der neuen 60D gibt es noch bei Bedarf einen Unterordner namens raw. Aufgrund des hohen Speicherplatzbedarfs (bei der 60D verbraucht ein Foto im RAW-Format über 20 (!) MB) behalte ich nur sehr gute Fotos die ich nachbearbeiten möchte in diesem Format. Ebenso verfahre ich mit Videos, diese sind bei der 60D in Full-HD oder HD-Ready äußerst groß. Mit Hilfe des Kommandozeilen-Tools ffmpeg codiere ich diese um so dass sie bei geringem Qualitätsverlust nur noch ein zehntel bis zwanzigstel an Speicherplatz verbrauchen (im mp4-Format, der Codec ist x264):
ffmpeg -i EINGABEDATEI.MOV -y -f mp4 -vcodec libx264 -crf 28 -threads 0 -flags +loop -cmp +chroma -deblockalpha -1 -deblockbeta -1 -refs 3
-bf 3 -coder 1 -me_method hex -me_range 18 -subq 7 -partitions +parti4x4+parti8x8+partp8x8+partb8x8 -g 320 -keyint_min 25 -level 41 -qmin 10
-qmax 51 -qns 2 -qcomp 0.7 -trellis 1 -sc_threshold 40 -i_qfactor 0.71 -flags2 +mixed_refs+dct8x8+wpred+bpyramid -padcolor 000000 -padtop 0
-padbottom 0 -padleft 0 -padright 0 -acodec libfaac -ab 128kb -ar 48000 -ac 2 AUSGABEDATEI.mp4
Auf die Bedeutung der einzelnen Kommandozeilenparameter möchte ich nicht eingehen, x264 ist extrem komplex zu konfigurieren.
Zur eigentlichen Verwaltung der Fotos setze ich auf Picasa. Hier gibt es die Linux-Version. Diese Version (3.0) ist gegenüber der aktuellen Windows-Version schon ziemlich veraltet, es gibt aber einen Trick mit dem man die neueste Windows-Version auch unter Linux laufen lassen kann. Dazu installiert man zunächst die verlinkte Linux-Version (diese ist eigentlich ein Windows-Programm welches etwas optimiert mit einem WINE unter Linux ausführbar gemacht wird). Dann kann man nach dieser Anleitung die aktuelle Windows-Version dort einbinden. So kann man auch die geniale Gesichtserkennung von Picasa unter Linux nutzen!
Für Backups verwende ich eine externe Festplatte welche ich aus Geschwindigkeitsgründen über eSata angeschlossen habe. Ab und an mache ich auch ein Backup auf meine Netzwerkfestplatte (NAS). Dazu verwende ich rsync inkrementell, und zwar so dass gelöschte Dateien auf meinem Rechner dann auch im Backup-Ordner gelöscht werden. Ab und an mache ich ein Full-Backup in einem gesonderten Verzeichnis falls ich versehentlich mal etwas wichtiges gelöscht haben sollte. Ein Beispiel für rsync:
rsync -r -t -v Bilder/ /media/274cec77-ec0d-4fd4-8ac2-c08a1f3e4eea/backups/fotos/
-r sorgt dafür dass in die Verzeichnisse rekursiv hinabgestiegen wird, -t behält den Zeitstempel der Ursprungsdatei bei und -v sorgt für ausführliche Ausgaben.
Zusätzlich habe ich noch ein Skript geschrieben welches automatisch ausgeführt wird wenn ich eine SD-Karte in den Kartenleser einlege. Es fragt mich dann ob ich die Bilder/Videos von der Karte automatisch in den entsprechenden Ordner herunterladen möchte (es wird dazu das aktuelle Datum verwendet). Es verwendet zenity um Dialogboxen unter Gnome darzustellen. Da ich es von udev als root ausführen lasse muss am Anfang noch das richtige DISPLAY gesucht werden. Die Pfade und Usernamen müssen natürlich noch an eigene Bedürfnisse angepasst werden:
#!/bin/bash
#Skript wird ausgeführt wenn SD-Karte eingesteckt wird...
#Muss von udev ausgeführt werden, mit nohup abkoppeln!
albumdir=/home/oster/Bilder/
sdcarddir=/media/EOS_DIGITAL/DCIM/
raw=raw/
video=./
pids=`pgrep -u oster gnome-panel`
DISPLAY_OSTER=`grep -z DISPLAY /proc/$pids/environ | sed -e 's/DISPLAY=//'`
mount /dev/sdcardcamera
if ! su oster -c "zenity --display=$DISPLAY_OSTER --question --title Fotos --text 'Fotos von Speicherkarte laden?'"; then
exit
fi
year=`date +%Y`
day=`date +%Y-%m-%d`
destdir=$albumdir$year/$day
if [ -e $destdir* ];then
echo $destdir already exists!
else
su oster -c "mkdir $destdir"
echo $destdir created.
su oster -c "mkdir $destdir/$raw"
su oster -c "mkdir $destdir/$video"
fi
su oster -c "nohup zenity --display=$DISPLAY_OSTER --info --text 'Kopiere Bilder..' &"
su oster -c "find $sdcarddir -name *.JPG -exec cp {} $destdir ;"
su oster -c "nohup zenity --display=$DISPLAY_OSTER --info --text 'Kopiere Raws..' &"
su oster -c "find $sdcarddir -name *.CR2 -exec cp {} $destdir/$raw ;"
su oster -c "nohup zenity --display=$DISPLAY_OSTER --info --text 'Kopiere Videos..' &"
su oster -c "find $sdcarddir -name *.MOV -exec cp {} $destdir/$video ;"
if su oster -c "zenity --display=$DISPLAY_OSTER --question --title Videos --text 'Videos umkonvertieren?'"; then
su oster -c "cd $destdir/$video && /home/oster/bin/videotox264.sh"
fi
su oster -c "zenity --display=$DISPLAY_OSTER --info --text 'Fertig!'"
Um dieses Skript nun automatisiert ausführen zu lassen lässt sich prima UDEV verwenden, nach dieser Anleitung muss man mittels
sudo lsusb -v
herausfinden welche Seriennummer die gewünschte Karte besitzt. Nun kann man unter
/etc/udev/rules.d/
eine neue Regel namens
99-sdcard.rules
anlegen mit folgendem Inhalt (Seriennummer und Pfade sollten natürlich noch angepasst werden):
BUS=="usb", KERNEL=="sd?1",SYSFS{serial}=="058F312D81B",SYMLINK+="sdcardcamera",RUN+="/home/oster/bin/fork /home/oster/bin/import_fotos.sh"
Das Skript namens
fork
sorgt dafür, dass UDEV nicht wartet dass das Import-Skript beendet ist bevor die SD-Karte eingehangen wird:
#!/bin/sh
#Entkoppeln des Skripts von udev:
/usr/bin/nohup $@ 1>/dev/null 2>&1
Das referenzierte Skript zum Umkodieren der Videos sieht folgendermaßen aus:
#!/bin/bash
# Komprimiert x264-Videos von Canon-DSLRs platzsparend (und qualitativ hochwertig).
# 2011 Stefan Ostermann#$1 input, $2 resolution
function recode {
ffmpeg -i $1 -y -f mp4 -vcodec libx264 $2 -crf 28 -threads 0 -flags +loop -cmp +chroma -deblockalpha -1 -deblockbeta -1 -refs 3 -bf 3 -coder 1 -me_method hex -me_range 18 -subq 7 -partitions +parti4x4+parti8x8+partp8x8+partb8x8 -g 320 -keyint_min 25 -level 41 -qmin 10 -qmax 51 -qns 2 -qcomp 0.7 -trellis 1 -sc_threshold 40 -i_qfactor 0.71 -flags2 +mixed_refs+dct8x8+wpred+bpyramid -padcolor 000000 -padtop 0 -padbottom 0 -padleft 0 -padright 0 -acodec libfaac -ab 128kb -ar 48000 -ac 2 "${1%.MOV}.mp4"
}function getwidth {
export width=`mplayer -frames 0 -vo null -ao null -identify -quiet 2>/dev/null $1 | grep -E -i "width"`
echo Width: $width
}
if [ $# -gt 0 ]; then
getwidth $1
elif [ $# -eq 0 ]; then
echo No Commandline-Parameter, decoding all MOVs...
for mov in *.MOV; do
if [ -e "${mov%.MOV}.mp4" ]; then
echo File "${mov%.MOV}.mp4" already exists, skipping...
else
recode $mov ""
fi
done
fiif [ "$width" == "ID_VIDEO_WIDTH=640" ]; then
echo 640x480-Video gefunden!
recode $1 "640x480"
elif [ $# -eq 1 ]; then
echo Found 16:9, keeping resolution
recode $1 ""
elif [ "$2" == "420p" ]; then
echo Found 16:9, Recode to 420p
recode $1 "-s 746x420"
elif [ "$2" == "720p" ]; then
echo Found 16:9, Recoding to 720p
recode $1 "-s 1280x720"
fi
Wie man die benötigten Programme/Codecs zum Umkodieren unter Ubuntu installiert habe ich hier beschrieben.
Das Anlegen dieser ganzen Skripte ist zwar recht kompliziert, automatisiert aber weitestgehend die Verwaltungs- und Umkodieraufgaben die mit so einer Kamera anfallen. Ich hoffe sie sind auch für andere nützlich.