Zeitrafferkamera - Time Lapse Cammera
Es wird eine Zeitrafferkamera mit einem Raspberry Pi 3 und einer Raspberry Pi High Quality Kamera, M12-Mount aufgebaut.
Das Besondere an diesem Projekt ist, dass die Kamera über einen undefinierten Zeitraum hinweg regelmäßig Bilder von einer Landschaft aufnimmt, ohne dabei auf Bewegungen zu reagieren – ganz im Gegensatz zu herkömmlichen Überwachungskameras.
Die Bilder werden automatisch in mp4-Videos konvertieren und mit Syncthing auf andere Clients übertragen.
Im Gegensatz zu 👉 Motion werden hier keine Aufnahmen bei Bewegung erstellt, sondern einfach stupide Bilder aufgenommen.
Es werden die Bordmittel rpicam-apps
für die Kamera 📹 verwendet.
Ordner für Time lapse und Videos anlegen
Die Zeitrafferaufnahmen (time lapse) werden auf ein externes Speichermedium (USB-Stick) abgelegt, welches bei jedem Neustart des Raspberry Pis über die /etc/fstab
automatisch eingebunden wird.
Auf dem gleichen Speichermedium wird ein weiterer Ordner angelegt, der nur die Videodateien enthält.
Der Datenträger ist ext4
formatiert. Die Anleitung wird im Artikel 👉 Motion ausführlich beschrieben.
Es werden die zwei Ordner angelegt.
# Time lapse pictures 🖼️
mkdir /mnt/motion/pictures/
# ffmpeg output video files 🎬
mkdir /mnt/motion/timelapse/
Aufnahme von Time Lapse Bildern
Zum Aufnehmen 📹 der Time Lapse Bilder wird ein Shell Skript verwendet, dass stündlich via Con gestartet 🏁 wird.
Das Skript wird im Verzeichnis /etc/scripts/custom/
unter dem Namen camera-timelapse.sh
abgespeichert.
sudo mkdir /etc/scripts/custom/
sudo touch /etc/scripts/custom/camera-timelapse.sh
sudo chown root:root /etc/scripts/custom/camera-timelapse.sh
sudo chmod 0700 /etc/scripts/custom/camera-timelapse.sh
sudo nano /etc/scripts/custom/camera-timelapse.sh
Das Skript besteht aus den folgenden Zeilen.
#!/usr/bin/env bash
# Path of time lapse pictures
picpath='/mnt/motion/pictures/'
#Date for daily folder
DATEFOLDER=$(date +"%Y-%m-%d")
# Date for time lapse pictures
DATE=$(date +"%Y-%m-%d_%H%M")
###
# Create today's picture folder
###
# Create today's folder for time lapse pictures
if test -f "${picpath}${DATEFOLDER}"
then
echo "++++++++++++++++++++++++++" >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - Start ${MAINSCRIPT} on $(hostname)" >&1
echo "++++++++++++++++++++++++++" >&1
echo >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - Folder already exists!" >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - Folder location: ${picpath}${DATEFOLDER}" >&1
else
echo "++++++++++++++++++++++++++" >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - Start ${MAINSCRIPT} on $(hostname)" >&1
echo "++++++++++++++++++++++++++" >&1
echo >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - Create folder!" >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - Folder location: ${picpath}${DATEFOLDER}" >&1
mkdir ${picpath}${DATEFOLDER}
fi
###
# Create folder /temp
###
if test -f "${picpath}temp/"
then
echo "++++++++++++++++++++++++++" >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - Start ${MAINSCRIPT} on $(hostname)" >&1
echo "++++++++++++++++++++++++++" >&1
echo >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - Folder already exists!" >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - Folder location: ${picpath}temp/" >&1
else
echo "++++++++++++++++++++++++++" >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - Start ${MAINSCRIPT} on $(hostname)" >&1
echo "++++++++++++++++++++++++++" >&1
echo >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - Create folder!" >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - Folder location: ${picpath}temp/" >&1
mkdir ${picpath}temp/
fi
###
# Take time lapse pictures
###
# timeout = length of time lapse (30000 milliseconds = 30 seconds)
# timelapse = take picture every 2 seconds (2000 milliseconds = 2 seconds)
# -o = output path
rpicam-still --timeout 30000 --timelapse 2000 -o ${picpath}temp/image-$DATE-%d.jpg
###
# Delete zero byte files
###
find ${picpath}temp/ -type f -size 0b -delete
###
# Copy images from temp to today's folder
###
cp ${picpath}temp/*.jpg ${picpath}${DATEFOLDER}
###
# Remove images from temp folder
###
rm ${picpath}temp/*.jpg
exit 0
Das Skript kann sofort gestartet 🚀 und getestet werden:
sudo sh /etc/scripts/custom/camera-timelapse.sh
Im Ordner /mnt/motion/pictures
wird ein neuer Ordner 📁 mit dem heutigen Datum angezeigt.
sudo ls -lah /mnt/motion/pictures
In diesem Ordner befinden sich die Zeitraffer-Bilder 🖼️.
Note
Bilder lassen sich nicht auf der CLI anschauen. Es wird dafür eine Desktop-Umgebung mit entsprechender Software benötigt.
Da die Tools auf dem Raspberry Pi nicht installiert wurden, können die Dateien zum Betrachten mit 🔗 rsync auf den eigenen Client übertragen werden.
Der Cron zum stündlichen ⏰ Ausführen des Skripts kann nach dem erfolgreichen Test angelegt werden.
sudo crontab -e
# Camera Time lapse
# hourly
0 07 * * * /bin/bash /etc/scripts/custom/camera-timelapse.sh
0 08 * * * /bin/bash /etc/scripts/custom/camera-timelapse.sh
0 09 * * * /bin/bash /etc/scripts/custom/camera-timelapse.sh
0 10 * * * /bin/bash /etc/scripts/custom/camera-timelapse.sh
0 11 * * * /bin/bash /etc/scripts/custom/camera-timelapse.sh
0 12 * * * /bin/bash /etc/scripts/custom/camera-timelapse.sh
0 13 * * * /bin/bash /etc/scripts/custom/camera-timelapse.sh
0 14 * * * /bin/bash /etc/scripts/custom/camera-timelapse.sh
0 15 * * * /bin/bash /etc/scripts/custom/camera-timelapse.sh
0 16 * * * /bin/bash /etc/scripts/custom/camera-timelapse.sh
0 17 * * * /bin/bash /etc/scripts/custom/camera-timelapse.sh
0 18 * * * /bin/bash /etc/scripts/custom/camera-timelapse.sh
0 19 * * * /bin/bash /etc/scripts/custom/camera-timelapse.sh
0 20 * * * /bin/bash /etc/scripts/custom/camera-timelapse.sh
Time Lapse Bilder in ein Video umwandeln
Die aufgenommenen Zeitraffer-Bilder lassen sich mithilfe von ffmpeg
in ein Video umwandeln.
Auf dem Raspberry Pi muss dafür ffmpeg
installiert werden.
sudo apt install ffmpeg
Das Skript kann via Cron gestartet werden, damit einmal am Tag alle Zeitraffer-Bilder in ein Video umgewandelt werden.
Das Skript wird im Verzeichnis /etc/scripts/custom/
unter dem Namen camera-timelapse-ffmpeg.sh
abgespeichert
sudo touch /etc/scripts/custom/camera-timelapse-ffmpeg.sh
sudo chown root:root /etc/scripts/custom/camera-timelapse-ffmpeg.sh
sudo chmod 0700 /etc/scripts/custom/camera-timelapse-ffmpeg.sh
sudo nano /etc/scripts/custom/camera-timelapse-ffmpeg.sh
Das Skript besteht aus den folgenden Zeilen.
#!/usr/bin/env bash
# Path of time lapse pictures
picpath='/mnt/motion/pictures/'
#Date for daily folder
DATEFOLDER=$(date +"%Y-%m-%d")
# Folder that contains the converted video file
output='/mnt/motion/timelapse/'
# Date for time lapse pictures
OUTPUTDATE=$(date +"%Y-%m-%d")
if test -f "${output}${OUTPUTDATE}.mp4"
then
echo "++++++++++++++++++++++++++" >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - Start ${MAINSCRIPT} on $(hostname)" >&1
echo "++++++++++++++++++++++++++" >&1
echo >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - File already exists!" >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - File: ${output}${OUTPUTDATE}.mp4" >&1
rm ${output}${OUTPUTDATE}".mp4" >&1
else
echo "++++++++++++++++++++++++++" >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - Start ${MAINSCRIPT} on $(hostname)" >&1
echo "++++++++++++++++++++++++++" >&1
echo >&1
echo "$(date +%Y-%m-%d_%H-%M-%S) - Continue to create ffmpeg video file" >&1
fi
###
# Reduces the file size of the images
###
# If the size of the images is to big ffmpeg may batch process not all pics in the daily folder.
# This operation can take a very long time based on the number of pics and RAM of your Raspberry Pi
mogrify -resize 2028x1520\> ${picpath}${DATEFOLDER}/*.jpg
###
# Create video file
###
# Creates a video file
ffmpeg -framerate 5 -pattern_type glob -i ${picpath}${DATEFOLDER}/'*.jpg' -c:v libx264 -crf 17 -pix_fmt yuv420p ${output}${OUTPUTDATE}.mp4
# - framerate = images used per second, the higher the framerate the faster the pictures will be played in the video
###
#Delete today's folder
###
# This is optional and can be used to delete today's picture folder with time lapse pics.
#rm -r ${picpath}${DATEFOLDER}
exit 0
Das Skript kann sofort gestartet 🚀 und getestet werden:
sudo sh /etc/scripts/custom/camera-timelapse-ffmpeg.sh
Im Ordner /mnt/motion/timelapse
wird eine neue Datei mit dem heutigen Datum angezeigt
sudo ls -lah /mnt/motion/timelapse
Das Skript soll einmal pro Tag ausgeführt werden, um alle Zeitraffer-Bilder in ein Video zu konvertieren.
sudo crontab -e
# ffmpeg conversion script
# At 22:00
0 22 * * * /bin/bash /etc/scripts/custom/camera-timelapse-ffmpeg.sh
Note
Sind die Bilddateien zu groß, kann ffmpeg
ggf. nicht alle Dateien verarbeiten und bricht irgendwann ab und erstellt nur eine halbfertige Videodatei.
Abhilfe schafft das vorherige Verkleinern der Bilder mit mogrify
.
Es kann durchaus vorkommen, dass ffmpeg
zu viele Ressourcen verbraucht und der kleine Raspberry Pi einfriert.
Eine Anpassung des Befehls kann Abhilfe schaffen:
ffmpeg -framerate 5 -pattern_type glob -i ${picpath}temp/'*.jpg' -c:v libx264 -crf 17 -pix_fmt yuv420p -threads 2 -bufsize 1M -probesize 100k -analyzeduration 1M -vsync 0 ${output}${OUTPUTDATE}.mp4
threads 2
: Begrenzung der Anzahl der Threads auf 2, um den Speicherverbrauch zu reduzieren.ffmpeg
verwendet standardmäßig viele Threads, was zu einer höheren Speichernutzung führt. Mit einer Begrenzung auf 2 Threads wird weniger RAM benötigt.bufsize 1M
: Setzt die Puffergröße für die Video-Codierung auf 1 MB. Kleinere Puffergrößen verringern den Speicherverbrauch während des Codierens, könnten jedoch die Leistung oder Qualität beeinflussen.probesize 100k
undanalyzeduration 1M
: Begrenzt die Menge an Daten, dieffmpeg
für die Eingabedateianalyse verwendet. Es wird weniger Speicher benötigt, da nur eine kleine Menge an Daten untersucht werden, anstatt die gesamte Datei zu laden.vsync 0
: Deaktiviert die Frame-Synchronisation, was den Speicherverbrauch während der Codierung reduziert.
Syncthing
Mithilfe von Syncthing lassen sich die Videos auf andere Geräte übertragen.
Für Syncthing
wird ein neuer Systembenutzer 👤 mit dem Namen timelapse
angelegt.
Der Zugriff für den neuen Systembenutzer auf den Ordner muss noch eingerichtet werden.
# Systembenutzer hinzufügen, ein Login ist nicht erlaubt
sudo useradd --system --no-create-home --shell=/sbin/nologin timelapse
Der Zugriff auf den Ordner wird dem Benutzer timelapse
gewährt.
sudo chown -R root:timelapse /mnt/motion/timelapse
sudo chmod -R 775 /mnt/motion/timelapse
Note
Der Hauptordner /mnt/motion/
benötigt die Rechte 0755
sudo chmod 0755 /mnt/motion
Gib mir gerne einen Kaffee ☕ aus 😀
Wenn dir meine Beiträge gefallen und geholfen haben, dann kannst du mir gerne einen Kaffee ☕️ ausgeben.
Follow Me
Source
- Teile des Artikels wurden mit maschineller Hilfe erstellt.
- Photo by Tobias Tullius on Unsplash