Das Starten der Raspi-Kamera ist ziemlich trivial:
raspivid -t 10000 -o test.h264
Problem:
Es gibt keine Möglichkeit, dies zu stoppen. Dies scheint mir wirklich dumm zu sein, da nach meinem besten Wissen keine Kamera für den Einzelhandel verfügbar ist, bei der der Benutzer angeben muss, wie viele Sekunden er laufen soll, und dann so viele Sekunden laufen muss, bevor er stoppt.
Hintergrund:
Dies stellt ein großes Problem bei der Überwachung dar. Ich erstelle ein Programm, bei dem die Heimüberwachung beim Verlassen des Benutzers eingeschaltet und bei der Rückkehr wieder ausgeschaltet wird. Wenn eine Bewegung unmittelbar vor der Rückkehr des Benutzers erkannt wird, beginnt die Kamera für einen festgelegten Zeitraum (dh 10 Minuten) mit der Aufzeichnung. Da der raspivid
Befehl jedoch blockiert wird, erhalte ich eine Situation, in der sich der Benutzer physisch im Haus befindet, aber das Programm ist im surveillance
Zustand. Um dies zu umgehen, starte ich einen Thread, um den raspivid
Befehl zu starten. Daher werden die Status jetzt korrekt aktualisiert, je nachdem, wann der Benutzer kommt und geht. Jetzt funktionieren andere Staaten jedoch nicht mehr. Zum Beispiel kann ich nicht in den TV
Status wechseln, da ich kein HD-Material aufnehmen und es gleichzeitig ansehen kann. Ebenso kann ich nicht zum wechselnParty
Zustand (ständige Videoaufzeichnung von Parteien), da die Kamera bereits aufzeichnet.
Mögliche Lösung:
Unter Verwendung von Code, den ich im Web gefunden habe (aber den Link zu nicht mehr finden kann), habe ich einen Hack gefunden, bei dem ich den Thread töte, der den raspivid
Befehl gestartet hat . Leider wird dies von SO als Blasphemie angesehen (siehe hier und hier ), was ich nicht nur zustimme, weil es die .h264
Dateien beschädigen und zu Speicherlecks führen könnte , sondern auch, weil es für mich ein Albtraum ist, Code zu schreiben (ich muss Sperren haben und Semaphore überall, da ich auch andere Threads zur Bewegungserkennung starte).
Frage:
Gibt es eine Möglichkeit, eine Aufnahme-Raspi-Kamera zu stoppen? Wenn nicht, warum nicht?
popen = subprocess.Popen ( cmd )
andpopen.send_signal ( signal.SIGINT )