Aufnahmen mit Raspberry Pi speichern

Hallo zusammen,

ich habe bei mir zu Hause vier Stück 2905 V2 zur Überwachung des Grundstückes und bekomme bei jedem Alarm eine E-Mail.

Seit ein paar Wochen habe ich eine synology DiskStation die eine Surveillance Station hat. Damit kann ich serienmäßig zwei Kameras aufnehmen lassen. Eigentlich gefällt mir die Funktion ganz gut, aber dabei läuft die DiskStation dauerhaft und verbraucht dabei im Jahr für ca. 120€ Strom.

Ich habe aber noch den Raspberry Pi 2 ungenutzt hier liegen, mit dem ich mir vorher meine Cloud gemacht habe, die ich nun dank der DiskStation nicht mehr brauche. Der Raspi braucht deutlich weniger Strom. Vielleicht kann man mit ihm so etwas ähnliches umsetzen.

Hat jemand schon Erfahrungen mit dem Raspi diesbezüglich? Oder gibt es ein Tutorial in diese Richtung? Die SuFu hat mir leider nichts gebracht. Auch in den Raspi Foren habe ich nicht das Richtige gefunden.

Schöne Weihnachten an Alle. :smiley_emoticons_br
ToTal

Hallo total,

etwas derartiges habe ich mit dem Raspberry umgesetzt:

  • drei Kameras (keine von Instar) die JPEG-Streams bei Alarm auf den Raspberry senden.
  • Der Raspi hat die Einzelbilder mit Hilfe von mencoder in Zeitraffervideos umgesetzt und diese zweimal am Tag auf das NAS gespeichert. Es war ein Raspi 1B. Er war damit voll ausgelastet … hat zweieinhalb Jahre gut gegangen (24x7).

Zusätzlich habe ich den Raspi als Webserver mit einem Reverse-Proxy-Modul aufgesetzt. Er leitet mir die Streams ins Internet oder ermöglicht einen Zugriff auf die Kameras. Wichtig ist mir, dass die Übertragung verschlüsselt ist. Der Raspberry übernahm das zuverlässig.

Erfahrung: Wenn im Sekundentakt massenweise Bilder auf die SD-Karte geschrieben werden, macht diese das nicht lange mit. Nach einem Jahr war meine hinüber. Daraufhin habe ich die Bilder in eine RAM-Disk gepuffert. Das war deutlich stabiler.

Derzeit setze ich das Ganze neu auf … diesmal mit einem etwas leistungsfähigeren BananaPi. Allerdings lagere ich die Aufgabe des Berechnens der Zeitraffervideos auf einen gemieteten virtuellen Server im Internet aus.
Das hat den Vorteil, dass die Daten auch woanders vorliegen. Der BananaPi holt sie von dort und schiebt sie auf mein NAS. Wenn der Strom ausfällt sind die Daten zwischendurch nicht weg.

Das Ganze habe ich grob dokumentiert … allerdings noch nicht in einer Form, die man veröffenlichen könnte.

Wenn Du den Raspberry 2 hast, dann sind für Dich ggf. auch die Lösungen mit „motion“ interessant.
Es gibt auch fertige Pakete. Suche mal nach dem Projekt „motioneye“, das könnte für Dich eine Lösung sein.

Gruß
Ralf

Hallo zusammen,

ich habe neben zwei InstarKameras auch eine low-Budget-Version mit einem Raspberry Pi 2+. Alle drei speichern Alarme auf das NAS und versenden Alarm-E-Mails.
Das RasPi läuft über Motion mittlerweile sehr stabil, während sich die 6001HD ca. 1 x pro Woche aufhängt (sprich kein WLAN-Kontakt mehr, dann nur Neustart möglich).
Beide gehen über WLAN, wobei das RasPi hier klar überlegen (zuverlässiges WLAN) ist.
Einzig die 5905HD, die am LAN direkt hängt, kann der RasPi-Cam das Wasser reichen.
Nachteil bei der RasPiCam ist die fehlende Nachtsicht, Vorteil die geringe Größe.

VG
InstarKamera

mit Perl-Skript auf die SD-Karte zugreifen

Hallo zusammen,

auf einem BananaPi (Raspberry sollte genauso gehen, ebenso alle Linux-Rechner und vermutlich auch Mac’s) nun eine Lösung gebastelt, bei der die Videos von der SD-Karte abgeholt werden.
Die Daten werden dann lokal (oder auf ein gemountetes Verzeichnis auf einem entfernten Rechner) abgelegt. Das Ganze habe ich in Perl (Version größer 5.10) geschrieben.
Wenn man das unter Windows nutzen will, muss man ggf. die direkten Betriebssystemkommandos (z.B. grep) anders lösen. Auch nutzt das Skript cURL und wget. Das kann Windows nur mit Zusatzsoftware.

Das Skript macht folgendes:
Es guckt für den aktuellen Tag auf der SD-Karte nach, wie viele record00n-Verzeichnisse es gibt. Diese werden auf Links nach Dateien durchsucht. Anschließend werden alle Videos der aktuellen Stunde mit wget geladen, sofern sie nicht schon im Zielverzeichnis vorhanden sind.

Bei mir läuft das alle paar Minuten als Cron-Job.
Vielleicht kann der ein oder andere was damit anfangen.

Gruß Ralf

Der Code sieht beispielhaft so aus:

#!/usr/bin/perl -w
use strict;
use Time::Piece;
use Time::Seconds;

Script to get new videos from SD card of Instar Camera to local file system

created 2016 May 15

2016 May 17 added Time::Piece and Time::Seconds modules and changed time commands

Requires curl and wget being installed

########### do not edit above! ###############
my $hostname = „192.168.178.123:234/sd“;# enter your local IP adress and port here
my $user = „admin“; #enter your username here
my $pw = „instar“; #enter user password here
my $target = „/home/pi/instar/avi“; #enter your target directory here
########### do not edit below! ###############

variables:

my $numrecords; #number of record0* directories on SD card for today
my @moviedir; #array with record0* directories
my @avis; #videos taken
my $movienum; #number of videos recorded
my $filename; #video filename
my $i; #counter

#getting current time and date
my $now = Time::Piece->new;
my $datestring = $now->strftime(’%Y%m%d’); #eg 20160517 for 17 May 2016
my $hourstring = $now->strftime(’%y%m%d_%H’); #to get files with string 160517_15 eg. on 17 May 2016 15:nn h

#counting number of „record“ drectories at current day
$numrecords = curl -s -u $user:$pw $hostname/$datestring/ | grep -c record;chomp $numrecords;
#debug
#print STDOUT "number of record directories is $numrecords
";

#creating directory name of movies
$numrecords–;
for $i(0…$numrecords) {
if ($i > 9) {push @moviedir, „record0$i“}
if ($i > 99) {push @moviedir, „record$i“}
else {push @moviedir, „record00$i“}
}
#debug
#debug foreach (@moviedir) {print STDOUT "$_
"}

#getting file names of all .avi files on the SD card today, indicated by links in the web side
foreach (@moviedir) {
#debug
#print STDOUT "curl -u $user:$pw http://$hostname/$datestring/$/ | grep -c avi
";
$movienum = curl -s -u $user:$pw http://$hostname/$datestring/$_/ | grep -c avi; chomp $movienum;
#debug
#print STDOUT "There are $movienum videos in $

";
@avis = curl -s -u $user:$pw http://$hostname/$datestring/$_/ | grep avi;
#debug
#foreach (@avis) {chomp; print STDOUT „$_
„}
foreach $filename(@avis) {
chomp $filename;
$filename =~ s/^<tr><td><a href=“/sd/$datestring/$_///;
$filename =~ s/“.
//;
# only get filesnames that do not yet exist, that are ready (!~ 999999) and that are from current hour
if ((! -e „$target/$filename“) and ($filename !~ /999999/) and ($filename =~ m/$hourstring/)) {
#if ((! -e „$target/$filename“) and ($filename !~ /999999/)) {
#print STDOUT "copy $filename to $target/
";
wget -q -np -nd --user $user --password $pw --output-document $target/$filename http://$hostname/$datestring/$_/$filename;
}
}
}

Videos aneinander hängen

Nachtrag zu meinem vorherigen Post:
Ich möchte nicht viele Videos auf dem BananaPi haben sondern nur eins pro Stunde. Dazu habe ich ein Skript geschrieben, das als Cron-Job immer 5 Minuten nach der vollen Stunde ausgeführt wird.
Es nutz das Linux-Paket ‚mencoder‘, dass mit dem MPlayer kommt. Es sucht die Videos der abgelaufenen Stunde und hängt diese aneinander.

Vielleicht kann das jemand brauchen.

Gruß
Ralf

Der Code sieht so aus:

#!/usr/bin/perl -w

script to merge all avi videos of an hour into one file

using mencoder

intended to run as cron short after full hour

created, 2016-05-16

use strict;
use Time::Piece;
use Time::Seconds;
#Variables
my $source = ("/home/pi/instar/avi");
my $target = ("/home/pi/instar/");

do not edit below

my $filename; #filename
my @filelist; #container
my $i = 0; #counter
my $k = 0; #counter
my $mencoder;

get date and time from operating system

my $now = Time::Piece->new;

get time from previous hour in format yymmdd_HH to check for filenames

my $last_hour = $now - ONE_HOUR;

get hourstring for filename in format 160517_17 e.g for 17 May 2016 17:00h

my $hourstring = $last_hour->strftime(’%y%m%d_%H’);
my $hour = $last_hour->strftime(’%H’);
my $day = $last_hour->strftime(’%d’);

mencoder command without time

$mencoder = „/usr/bin/mencoder -oac copy -ovc copy -idx -o $source/“;

#globbing all files of the last hour

@filelist = glob ("$source/$hourstring");
for $i(0…$#filelist) {
#print STDOUT "$filelist[$i]
";
if ($i eq 0) {system($mencoder.„tmp-$hour-$i.avi $filelist[$i]“)}
else {
$k = $i-1;
system($mencoder.„tmp-$hour-$i.avi $source/tmp-$hour-$k.avi $filelist[$i]“);
unlink „$source/tmp-$hour-$k.avi“;
}
}
#print STDOUT „command is $mencoder
„;
rename „$source/tmp-$hour-$#filelist.avi“,“$target/$day-$hour.avi“;

#removing processed files
foreach $filename(@filelist) {
#print STDOUT "removing $filename
";
unlink $filename;
}

und Nein, ich schreibe meine Skripte nicht ohne Einrückungen für die Schleife … aber die gehen in der Forumssoftware verloren.
Ein vernünftiger Texteditor mit Syntaxerkennung biegt das wieder gerade :icon_razz: