Zum Inhalt

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 und analyzeduration 1M: Begrenzt die Menge an Daten, die ffmpeg 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.

Donation via PayPalDonation via LiberaPay

Donation via Bitcoin
Bitcoin Address: bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj

Source
  • Teile des Artikels wurden mit maschineller Hilfe erstellt.
  • Photo by Tobias Tullius on Unsplash