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 raspivid
commande 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 raspivid
commande, 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 raspivid
commande. 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 .h264
fichiers 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?
popen = subprocess.Popen ( cmd )
etpopen.send_signal ( signal.SIGINT )