Existe-t-il un moyen d'arrêter / mettre en pause un enregistrement actif / sur une caméra Raspi?

8

Le démarrage de la caméra Raspi est plutôt trivial:

raspivid -t 10000 -o test.h264

Problème:

Il n'y a aucun moyen d'arrêter cela. Cela me semble vraiment stupide car, à ma connaissance, il n'y a pas de caméra disponible pour la vente au détail qui oblige l'utilisateur à spécifier le nombre de secondes à courir, puis s'exécute pendant autant de secondes avant de s'arrêter.

Contexte:

Cela présente un énorme problème de surveillance. Je crée un programme où la surveillance à domicile est activée lorsque l'utilisateur quitte, puis à nouveau à son retour. Si un mouvement est détecté juste avant le retour de l'utilisateur, la caméra commence à enregistrer pendant une période de temps prédéterminée (c.-à-d. 10 minutes), mais comme la raspividcommande est bloquante, j'obtiens une situation où l'utilisateur est physiquement dans la maison, mais le programme est en l' surveillanceétat. Pour contourner cela, je lance un thread pour lancer la raspividcommande, donc maintenant les états sont correctement mis à jour en fonction du moment où l'utilisateur va et vient. Cependant, maintenant, d'autres États ne fonctionnent pas. Par exemple, je ne peux pas passer à l' TVétat car je ne peux pas enregistrer de séquences HD et les regarder en même temps. De même, je ne peux pas passer auParty état (enregistrement vidéo constant des parties) car la caméra enregistre déjà.

Solution potentielle:

En utilisant du code que j'ai trouvé sur le web (mais je ne trouve plus le lien), j'ai trouvé un hack par lequel je tue le thread qui a lancé la raspividcommande. Malheureusement, cela est considéré comme un blasphème par SO (voir ici et ici ), avec lequel je suis d'accord non seulement parce qu'il pourrait corrompre les .h264fichiers et entraîner des fuites de mémoire, mais aussi parce que c'est un cauchemar pour moi de coder (je dois avoir des verrous et sémaphores partout car je lance également d'autres threads pour la détection de mouvement).

Question:

Existe-t-il un moyen d'arrêter une caméra Raspi d'enregistrement? Sinon, pourquoi pas?

puk
la source

Réponses:

7

L'inspection du code source Raspividrévèle qu'il existe deux façons d'interrompre la capture.

La première méthode consiste à envoyer n'importe quel SIGNAL au processus de capture. Le signal est traité par le code suivant dans 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);
    }

Il en résulte que le processus de capture termine l'exécution en 100 ms en moyenne.

Comme indiqué dans les commentaires de cette réponse, cela peut être accompli en Python en utilisant le code suivant:

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

Une autre méthode serait d'utiliser le rappel des données utilisateur, qui a un champ:

    callback_data.abort = 0;

et vous pouvez deviner ce qui se passe si vous définissez ce champ sur autre chose que zéro =)

Si vous avez besoin d'explications plus détaillées, j'aimerais vous inviter à vérifier le code source .

lenik
la source
Merci. Cependant, je ne suis pas sûr de ce que c'est. Est-ce C? J'aurais dû mentionner que mon code est Python. J'ai réussi à trouver un moyen [très douloureux] de contourner cela en utilisant popen = subprocess.Popen ( cmd )etpopen.send_signal ( signal.SIGINT )
puk
eh bien, envoyer des signaux est la première approche dont j'ai parlé, désolé c'était douloureux =)
lenik
1
les signaux STOP et CONT fonctionnent généralement bien pour cela
John La Rooy
Pour info, un code a été ajouté pour raspividpermettre l'utilisation de signaux pour contrôler l'enregistrement de la vidéo. Vous pouvez maintenant utiliser des signaux pour mettre en pause puis reprendre l'enregistrement. Il n'est pas clair s'il existe un moyen de signaler la sortie du programme et la fermeture du fichier de sortie avec élégance. Voir github.com/raspberrypi/userland/pull/104 pour plus de détails sur les nouvelles options ajoutées raspivid.
HeatfanJohn
Je l'ai fait dans le noeud js en envoyant un signal SIGTERM pour le quitter gracieusement.
Goofyahead
2

Essayez d' utiliser l' -koption de (keypress): Cycle between capture and pause on ENTER.

raspivid -t 10000 -o test.h264 -k

Après avoir exécuté cette commande, appuyez sur «x» et «entrée» pour arrêter la vidéo.

Ugi Prashanth Gopal
la source