Gibt es eine Möglichkeit, eine aktive Aufnahme / eine Raspi-Kamera anzuhalten / anzuhalten?

8

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 raspividBefehl jedoch blockiert wird, erhalte ich eine Situation, in der sich der Benutzer physisch im Haus befindet, aber das Programm ist im surveillanceZustand. Um dies zu umgehen, starte ich einen Thread, um den raspividBefehl 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 TVStatus 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 raspividBefehl gestartet hat . Leider wird dies von SO als Blasphemie angesehen (siehe hier und hier ), was ich nicht nur zustimme, weil es die .h264Dateien 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?

puk
quelle

Antworten:

7

Wenn Sie den Quellcode überprüfen, um Raspividfestzustellen, dass es zwei Möglichkeiten gibt, die Erfassung zu unterbrechen.

Die erste Methode besteht darin, ein beliebiges SIGNAL an den Erfassungsprozess zu senden. Das Signal wird mit folgendem Code verarbeitet Raspivid:

    /**
     * Handler for sigint signals
     *
     * @param signal_number ID of incoming signal.
     *
     */
    static void signal_handler(int signal_number)
    {
        // Going to abort on all signals
        vcos_log_error("Aborting program\n");

        // TODO : Need to close any open stuff...how?

       exit(255);
    }

Dies führt dazu, dass der Erfassungsprozess die Ausführung in durchschnittlich 100 ms beendet.

Wie in den Kommentaren zu dieser Antwort erwähnt, kann dies in Python mithilfe des folgenden Codes erreicht werden:

    popen = subprocess.Popen ( cmd )
    .
    .
    .
    popen.send_signal ( signal.SIGINT )

Eine andere Methode wäre die Verwendung eines Benutzerdaten-Rückrufs mit dem folgenden Feld:

    callback_data.abort = 0;

und Sie können erraten, was passiert, wenn Sie dieses Feld auf etwas anderes als Null setzen =)

Wenn Sie eine ausführlichere Erklärung benötigen, möchte ich Sie einladen, den Quellcode zu überprüfen .

lenik
quelle
Vielen Dank. Ich bin mir jedoch nicht sicher, was beides ist. Ist das C? Ich hätte erwähnen sollen, dass mein Code Python ist. Ich habe es geschafft, einen [sehr schmerzhaften] Weg zu finden, indem ich popen = subprocess.Popen ( cmd )andpopen.send_signal ( signal.SIGINT )
puk
Nun
1
Normalerweise funktionieren STOP- und CONT-Signale dafür in Ordnung
John La Rooy
Zu Ihrer Information wurde Code hinzugefügt, raspividum die Verwendung von Signalen zur Steuerung der Videoaufzeichnung zu ermöglichen. Sie können jetzt Signale verwenden, um die Aufnahme anzuhalten und fortzusetzen. Es ist unklar, ob es eine Möglichkeit gibt, das Beenden des Programms und das ordnungsgemäße Schließen der Ausgabedatei zu signalisieren. Weitere Informationen zu den neuen Optionen, die hinzugefügt werden, finden Sie unter github.com/raspberrypi/userland/pull/104raspivid .
HeatfanJohn
Ich habe es in Knoten js geschafft, ein SIGTERM-Signal zu senden, um es ordnungsgemäß zu beenden.
Goofyahead
2

Versuchen Sie es mit der -kOption (Tastendruck) : Cycle between capture and pause on ENTER.

raspivid -t 10000 -o test.h264 -k

Nachdem Sie diesen Befehl ausgeführt haben, drücken Sie 'x' und 'Enter', um die Videoaufnahme zu beenden.

Ugi Prashanth Gopal
quelle