#!/bin/bin/bash######################################################################################################## #ipc3hour.sh Kamera IPC3, Igelhaus, Aufnahme vom Innenbereich # Sammelt die jeweils in der vergangenen Stunde aufgelaufenen Videodateien ein, # ändert die Dateinamen und fügt sie zu einem Video zusammen. # Diese können nach Ablauf des Tages zu einem Tagesvideo zusammngefaßt werden. # Neuer Kameratyp (Oktober 2021) dahua DH-IPC-K42AP # Script wird jede Stunde zur 5. Minute mittels Crontab gestartet. # Änderungen an der Verzeichnisstruktur Januar 2022 # Erweiterung um den Versand auf den Webserver im Februar 2022, SFTP # Änderung der Ausgabedatei für den Webserver auf Dateinamen V640480.mp4 16.02.2022 # Änderungen an den Logdateien: 14.03.2022 # Umstrukturierung der Rechnerumgebung: Programmumzug auf den Raspberry DENDROBATES von AGALCHYNIS # 18.03.2022 leichte Korrekturen zur Anpassung der Logfiles # 21.03.2022 Erweiterte Korrekturen der Logfiles, Umsetzung des Programms auf AGALCHYNIS (IPC5) # 22.03.2022 Überarbeitung des sftp-Zuganges zur Telekom # 23.05.2022 Anpassung an die (vorübergehend) am Eingang des Igelhauses angebrachte Kamera # 24.05.2022 Verteilung auf anderen Rehner zur Sicherung # 24.05.2022 Einbindung ESCULENTA als Fileserver IPC2, IPC3, IPC4, IPC5 gegen MANTELLA # 07.06.2022 Erneute Änderung des Scripts wegen Wegfall des Servers Osteopilus ####################################################################################################### # Variabeln # Allgemein # Vorsicht, diese Variable hat je nach Kameratyp einen anderen Wert videoname="-Igelhaus" # Videoname als Anhamg zu den Zeitdaten der mp4-Datei camname="IPC3" # Kameraname im Heimnetzwerk today=$(date '+%d-%m-%Y') videodetail=$(date '+%d%m%Y') # War entworfen für die bessere Sortierbarkeit under="_" yesterday=$(date -d "yesterday" '+%d-%m-%Y') actualhour=$(date '+%H') recactualhour=$( date '+%F_%H_%M_%S' ) starttime=$( date '+%F_%H:%M:%S' ) startscript=$( date '+%s' ) camsafedir="dav" # Auch dies ist eine Vorgabe bei Kameras des Herstellers DAHUA uns Replikas wie Blaupunkt etc. sep="/" #Trennen der Verzeichnisse texthour="hour" # Erweiterung der Stunde mit der Endung hour (von der Kamera vorgegeben) lasthour=$(date -d "-1 hours" '+%H') recdateyesterday=$(date -d "yesterday" '+%Y-%m-%d') # Die Aufzeichnungen wurden von 23-24 Uhr des Vortages erzeugt recdateactual=$(date '+%Y-%m-%d') # Aktueller Tag yesterday=$(date -d "yesterday" '+%d-%m-%Y') actualhour=$(date '+%H') recactualhour=$( date '+%F_%H_%M_%S' ) starttime=$( date '+%F_%H:%M:%S' ) TOTALSTART=$( date '+%s' ) homeshare="/home/pi/Share/NAS1/Igel/Igel1/Innenbereich" webshare="public_html/IPC/Ige11/Innenbereich" extmp4=".mp4" # Letzte Stunde muß von OKTAL auf STRING gewandelt werden lasthour=$(date -d "-1 hours" '+%H') # Parameter lasthour für die vergangene Stunde nur zum Testen ändern, Format "00" #lasthour="13" longlast="AAAA"$lasthour echo "Das Program bereitet den Start vor!" echo "Stundenstring, alt: "$longlast newlast="${longlast:4:7}" echo "Stundenstring, neu: "$newlast lasthour=$newlast # Das Haupverzeichnis ist ein Network File System auf dem Server esculenta maindir="/home/pi/Share/esculenta/Igel/Igel1"$sep$camname # Das Hauptverzeichnis für die Kamera, steht im Igelhaus im Innenbereich #sudo chown -R pi:users $maindir # Log-Dateien logname=$lasthour"-"$actualhour$videoname".txt" logfiles="logfiles" logdir=$maindir logname=$maindir$sep$logname # Setze die Vergleichsstunden echo "Programmstart: "$actualhour > $logname # Prüfe ob das Verzeichnis korrekt montiert ist if [ -d "$maindir" ]; then sudo echo "Hauptverzeichnis existiert, Bearbeitung wird fortgesetzt." >> $logname else sudo echo "Hauptverzeichnis existiert nicht, Programm wird beendet." > Fehler.txt exit 0 fi # Vorsicht, diese Variable hat je nach Kameratyp einen anderen Wert today=$(date '+%d-%m-%Y') under="_" yesterday=$(date -d "yesterday" '+%d-%m-%Y') actualhour=$(date '+%H') actualtime=$(date '+%F_%H:%M:%S' ) recactualhour=$( date '+%F_%H_%M_%S' ) starttime=$( date '+%F_%H:%M:%S' ) startscript=$( date '+%s' ) camsafedir="dav" # Auch dies ist eine Vorgabe bei Kameras des Herstellers DAHUA uns Replikas wie Blaupunkt etc. sep="/" # Trennen der Verzeichnisse texthour="hour" # Erweiterung der Stunde mit der Endung hour (von der Kamera vorgegeben) rechour=$( date '+%F_%H:%M:%S' ) # Aufnahmezeit # Den Parameter für manuellen Start für Aufnahme des Vortages von 23 - 24 Uhr festlegen # Auch diesen Parameter nur zum Testen ändern sav=".sav" extmp4=".mp4" extmkv=".mkv" camsafedir="dav" # Dies ist eine Vorgabe bei Kameras des Herstellers DAHUA und Replikas wie Blaupunkt etc. camcopydir="HOURCOPY" camdaydir="DAYCOPY" mp4hour=$videodetail$videoname # Das ist der Name der Videodatei mit Datum, aber noch ohne Zeitraum und Endung echo "Das Script zur Erzeugung der Videozusammenfassung wurde um "$starttime" gestartet!" > $logname echo "Ich werde die Daten zur Stunde: "$lasthour" verarbeiten!" >> $logname echo "Die Videodatei wird folgenden Namen tragen: "$mp4hour >> $logname # Falls die letzte Stunde 23 lautet wird in das Vortagesverzeichnis gewechselt if [[ $lasthour = "23" ]] ;then camworkdir=$maindir$sep$recdateyesterday$sep$lasthour$texthour$sep$camsafedir echo "Arbeitsverzeichnis liegt im Vortag: "$camworkdir >> $logname echo "Stundenvideo des Tages: "$recdateyesterday" zur Stunde "$lasthour" Uhr wird um "$recactualhour" erzeugt!" >> $logname else camworkdir=$maindir$sep$recdateactual$sep$lasthour$texthour$sep$camsafedir echo "Arbeitsverzeichnis liegt im aktuellen Tag: "$camworkdir >> $logname echo "Stundenvideo des Tages: "$recdateactual" zur Stunde "$lasthour" Uhr wird um "$rechour" erzeugt!" >> $logname fi # Setze die Zugriffsrechte auf pi:users #sudo chown -R pi:users $maindir $logdir $camworkdir # Setze die Variable für die Speicherung auf dem Webserver für die jeweilige Stundehourdir="" if [[ $lasthour = "00" ]] ;then hourdir="00-01" elif [[ $lasthour = "01" ]] ;then hourdir="01-02" elif [[ $lasthour = "02" ]] ;then hourdir="02-03" elif [[ $lasthour = "03" ]] ;then hourdir="03-04" elif [[ $lasthour = "04" ]] ;then hourdir="04-05" elif [[ $lasthour = "05" ]] ;then hourdir="05-06" elif [[ $lasthour = "06" ]] ;then hourdir="06-07" elif [[ $lasthour = "07" ]] ;then hourdir="07-08" elif [[ $lasthour = "08" ]] ;then hourdir="08-09" elif [[ $lasthour = "09" ]] ;then hourdir="09-10" elif [[ $lasthour = "10" ]] ;then hourdir="10-11" elif [[ $lasthour = "11" ]] ;then hourdir="11-12" elif [[ $lasthour = "12" ]] ;then hourdir="12-13" elif [[ $lasthour = "13" ]] ;then hourdir="13-14" elif [[ $lasthour = "14" ]] ;then hourdir="14-15" elif [[ $lasthour = "15" ]] ;then hourdir="15-16" elif [[ $lasthour = "16" ]] ;then hourdir="16-17" elif [[ $lasthour = "17" ]] ;then hourdir="17-18" elif [[ $lasthour = "18" ]] ;then hourdir="18-19" elif [[ $lasthour = "19" ]] ;then hourdir="19-20" elif [[ $lasthour = "20" ]] ;then hourdir="20-21" elif [[ $lasthour = "21" ]] ;then hourdir="21-22" elif [[ $lasthour = "22" ]] ;then hourdir="22-23" elif [[ $lasthour = "23" ]] ;then hourdir="23-00" else hourdir="XX" fi # Prüfe zuerst, ob das Stundenverzeichnis existiert, sonst wurden in der betreffenden Stunde gar keine Bewegungen erkannt # und somit auch keine MP4-Dateien erzeugt # Protokolliere den Start echo "Script wurde um: "$starttime" gestartet!" > $logname echo "Das Protokoll wird in die Datei: "$logname" im Verzeichnis "$logdir" geschrieben!" >> $logname echo "Arbeitsverzeichnis ist: "$camworkdir >> $logname # Prüfe, ab das Verzeichnis für die Stundenaufnahme überhaupt existiert if [ -d "$camworkdir" ]; then echo "Arbeitsverzeichnis existiert, Bearbeitung wird fortgesetzt." >> $logname else echo "Arbeitsverzeichnis existiert nicht, Programm wird beendet." >> $logname exit 0 fi # Prüfe, ob das Verzeichnis für die MP4-Dateien der vergangenen Stunden existiert # und lege es sonst neu an if [ -d $camworkdir$sep$camcopydir ] then echo "Verzeichnis für zu bearbeitende MP4 der vergangenen Stunde ist bereits vorhanden." >> $logname else echo "Lege das Verzeichnis "$camworkdir$sep$camcopydir" zur Bearbeitung der MP-Dateien der vergangenen Stunde neu an!" >> $> sudo mkdir $camworkdir$sep$camcopydir fi # Prüfe, ob das Verzeichnis für die Tageszusammenfassung der einzelnen MP-Dateien der Stunden existiert if [ -d $camworkdir$sep$camdaydir ] then echo "Verzeichnis für die zu bearbeitenden MP4-Dateien des Tages ist bereits vorhanden." >> $logname else echo "Lege das Verzeichnis "$camworkdir$sep$camdaydir" zur Bearbeitung der MP-Dateien des Tages "$today" neu an!" >> $logna> sudo mkdir $camworkdir$sep$camdaydir fi # Wechsele in das Arbeitsverzeichnis cd $camworkdir$sep$copydir # Lese Anzahl der vorhandenen Videos aus total="`ls *.mp4 | wc -l`" echo "Anzahl vorhandener Videos für den Zeitraum "$hourdir": "$total >> $logname # Lese alle vorhandenen Videos in einer Schleife und benenne sie um # Lösche Index-Dateien rm *.idx i="0" counter="1" for i in *.mp4; do oldname=$i echo "Zähler: "$counter echo "Alter Name: "$oldname newname=$counter$extmp4 echo "NeuerName: "$newname # Kopiere die umbenannten Dateien in das Berarbeitungsverzeichnis sudo cp $oldname $camworkdir$sep$camcopydir$sep$newname echo "Datei Nummer: "$counter" wird angelegt: "$camworkdir$sep$camcopydir$sep$newname >> $logname ((counter=counter+1)) # Prüfe, ob die Datei im Arbeitsvereichnis korrekt angelegt/kopiert wurde, # in diesem Fall können die vorhandenen IDX-Dateien und MP4-Dateien gelöscht werden # Sollten die umbenannten Datein nicht kopiert worden sein, wirde die Verarbeitung abgebrochen if [ -f $camworkdir$sep$camcopydir$sep$newname ] then echo "Die zu verarbeitende Datei: "$newname" wurde ín das Arbeitsverzeichnis "$camworkdir$sep$camcopydir" kopiert!" > else echo "FEHLER !!! Die MP4-Datei "$newname" wurde nicht in das Arbeitsverzeichnis "$camworkdir$sep$camcopydir"kopiert!> echo "Beende das Programm!" >> $logname exit 0 fi done # Wechsele in das Verzeichnis der umbenannten Dateien der jeweiligen Stunde cd $camworkdir$sep$camcopydir # Füge die MP4-Dateien der vergangenen Stunde zu einer Datei zusammen # Erweitere den Videonamen um den Zeitraum und die Dateiendung mp4hour=$mp4hour"-"$hourdir$extmp4 echo "Dieses Video wird aus den einzelnen Videos zusammengefügt: " $mp4hour >> $logname for f in *.mp4 ; do echo file \'$f\' >> mp4list.txt; done # Sortiere die erzeugte Liste in ein für ffmpeg mit concatenate gültiges Format absolut aufsteigend sort -n -k1.7,1.8 mp4list.txt > sorted.txt # Nun beginnt die Zusammensetzung der einzelnen MP4-Dateien zu einem Stundenvideo echo "Erzeuge MP4-Datei: "$mp4hour >> $logname startmp4=$( date '+%s' ) ffmpeg -safe 0 -f concat -i sorted.txt -c copy $hourdir$extmp4 stopmp4=$( date '+%s' ) secmp4=`echo "$stopmp4-$startmp4" |bc` echo "Erzeugungsdauer: "$hourdir$extmp4"in Sekunden: "$secmp4 >> $logname # Verkleinere die DateiGröße echo "Verkleinere das Format von: "$hourdir$extmp4" auf 640x480 Pixel in die Datei "$mp4hour >>$logname startmkv=$( date '+%s' ) ffmpeg -i $hourdir$extmp4 -vf "scale='min(640,iw)':'min(480,ih)'" $mp4hour #ffmpeg -i $hourdir$extmp4 -s 640x480 -b 512k -async 50 -acodec libmp3lame -ar 11025 -ab 16k $videoname$hourdir$extmkv stopmkv=$( date '+%s' ) secmkv=`echo "$stopmkv-$startmkv" |bc` echo "Konvertierungsdauer von "$hourdir$extmp4" zu "$mp4hour" in Sekunden: "$secmkv >> $logname # Schreibe Daten des Speicherverzeichnisses für die Logdatei df -h . > dirmp4.txt dirmp4='dirmp4.txt' nummer=1 while read zeile[nummer] do echo "$nummer. Zeile: ${zeile[nummer]}" nummer=$((nummer+1)) done < "$dirmp4" echo "${zeile[2]}" > dateisystem.txt # Datei mit der zweiten Zeile einlesen und Zeichenkette zerlegen IFS=" " read zeile < dateisystem.txt echo "Zeile: "$zeile set " " $zeile echo "$1 $2 $3 $4 $5 $6 $7 $8" dateisystem=$2 groesse=$3 benutzt=$4 verfuegbar=$5 verwendet=$6 arbeitsverzeichnis=$7 echo "Dateisystem: "$dateisystem >> $logname echo "Größe: "$groesse >> $logname echo "Benutzt: "$benutzt >> $logname echo "Verfügbar: "$verfuegbar >> $logname echo "Verwendet: "$verwendet >> $logname echo "Arbeitsverzeichnis: "$arbeitsverzeichnis >> $logname # Verschiebe die Datei für die Bearbeitung als Tagesvideo in das Tagesverzeichnis # Aktualisiere den Zeitpunkt der Erzeugung des Videos rechour=$( date '+%F_%H:%M:%S' ) echo "Das Video "$mp4hour" wurde um "$rechour" erzeugt!" >> $logname mv $hourdir$extmp4 $camworkdir$sep$camdaydir # Prüfe, ob das Verzeichnis für die Tageszusammenfassung der einzelnen MP-Datei der vergangenen Stunde existiert, # wenn nicht hat keine Verarbeitung stattgefunden und die weitere Verarbeitung ist sinnlos if [ -f $camworkdir$sep$camdaydir$sep$hourdir$extmp4 ] then echo "Die MP4-Datei: "$hourdir$extmp4" wurde ín das Tagesverzeichnis "$camdaydir" kopiert!" >> $logname else echo "FEHLER !!! Die MP4-Datei "$hourdir$extmp4" wurde nicht in das Tagesverzeichnis "$camdaydir"kopiert!" >> $logname echo "Hier liegt ein Problem vor. Bitte prüfen!" >> $logname #exit 0 fi # Protokolldatei stopscript=$( date '+%s' ) starttime=$startscript stoptime=$stopscript secs=`echo "$stoptime-$starttime" |bc` echo "Laufzeit bisher in Sekunden: "$secs >> $logname tage=$(($secs/86400)) stunden=$(($secs%86400/3600)) minuten=$(($secs%3600/60)) sekunden=$(($secs%60)) echo "Programmlaufzeit: "$tage" Tage, "$stunden" Stunden, "$minuten" Minuten und "$sekunden" Sekunden." >> $logname # Lösche nun die verarbeiteten Dateien im Tagesverzeichnis, die erzeugte Zusammenfassung wird danach umbenannt cd $camworkdir$sep$camcopydir echo "Ich verarbeite die Datei: "$mp4hour >> $logname # Lese die Eigenschaften der erzeugten Videodatei (MP4) ein und gebe Laufzeit und Größe aus mediainfo $mp4hour --Logfile=mp4.txt datmp4='mp4.txt' # Lese die Eckdaten der MP4-Datei ein nummer=1 while read zeile[nummer] do # echo "$nummer. Zeile: ${zeile[nummer]}" nummer=$((nummer+1)) done < "$datmp4" echo "Dateigröße: "${zeile[6]} echo "${zeile[6]}" > dateigroesse.txt echo "Videolaufzeit: "${zeile[7]} echo "${zeile[7]}" > videolaufzeit.txt # Dateigröße einlesen und Zeichenkette zerlegen IFS=" " read zeile < dateigroesse.txt ifs=" " set " " $zeile dateigroesse=$5 mb=$6 echo "Dateigröße: "$dateigroesse" "$mb >> $logname # Laufzeit einlesen und Zeichenkette zerlegen IFS=" " read zeile < videolaufzeit.txt set " " $zeile dauermin=$4 echo "Minuten: "$dauermin dauersec=$6 echo "Sekunden: "$dauersec echo "Videolaufzeit: "$dauermin" Minuten und "$dauersec" Sekunden" >> $logname # Übertragung auf den Webserver echo "Folgende Dateien sollen übertragen werden: "$mp4hour startftp=$( date '+%s' ) echo "Verbindungsaufbau mit hosting.telekom.de um "$actualtime >> $logname echo "Verbindungsaufbau mit hosting.telekom.de um "$actualtime echo "Das Stundenverzeichnis lautet: /home/www/public_html/IPC/Igel1/"$hourdir >>$logname if [ -f $camworkdir$sep$camdaydir$sep$hourdir$extmp4 ] then echo "Die MP4-Datei: "$hourdir$extmp4" liegt im Tagesverzeichnis "$camdaydir else echo "Es liegt ein Problem vor!" fi if [ -f $mp4hour ] then echo "Die MP4-Datei: "$mp4hour" liegt im Stundenverzeichnisverzeichnis "$maindir"/"$HOURCOPY >>$logname else echo "Es liegt ein Problem mit der Datei "$mp4hour" vor!" >>$logname fi export SSHPASS=DAS FTP-Passwort sshpass -e sftp -oBatchMode=no -b - admin@commentum.de@hosting.telekom.de<< ! cd public_html/IPC/Igel1/Innenbereich pwd ls put $mp4hour bye ! stopftp=$( date '+%s' ) secftp=`echo "$stopftp-$startftp" |bc` echo "Übertragungsdauer in Sekunden: "$secftp >> $logname # Verschiebe die Stundendatei zum Homeserver mv $mp4hour $homeshare # Prüfe ob Kopie werfolgreich war, dann können verarbeitete MP$ gelöscht werden cd $homeshare if [ -f ] then echo "Die zu verarbeitende Datei "$mp4hour" wurde in das Verzeichnis "$homeshare" übertragen !" >> $logname echo "Die verbliebenen MP4-Dateien werden gelöscht!" >> $logname #rm *.mp4 else echo "Die zu verarbeitende Datei "$mp4hour" wurde nicht verschoben!" >> $logname echo "Bitte den Programmstatus prüfen!" >> $logname fi cd $camworkdir # Lösche nun die bereits verabeiteten MP4 #rm *.mp4 # Protokolldatei der gesamten Laufzeit TOTALSTOP=$( date '+%s' ) echo "Startscript: "$TOTALSTART >> $logname echo "Stopscript: "$TOTALSTOP >> $logname starttime=$TOTALSTART stoptime=$TOTALSTOP secs=`echo "$stoptime-$starttime" |bc` tage=$(($secs/86400)) echo "Tage: "$tage >> $logname stunden=$(($secs%86400/3600)) echo "Stunden: "$stunden >> $logname minuten=$(($secs%3600/60)) echo "Minuten: " $minuten >> $logname sekunden=$(($secs%60)) echo "Sekunden: "$sekunden >> $logname echo "Programmlaufzeit insgesamt: "$tage" Tage, "$stunden" Stunden "$minuten" Minuten und "$sekunden" Sekunden." >> $logname