Iniciar a câmera Raspi é bastante trivial:
raspivid -t 10000 -o test.h264
Problema:
Não há como parar isso. Isso me parece realmente estúpido, pois, até onde sei, não há uma câmera disponível para o varejo que exija que o usuário especifique quantos segundos executar e depois execute por muitos segundos antes de parar.
Fundo:
Isso apresenta um enorme problema na vigilância. Estou criando um programa em que a vigilância doméstica é ativada quando o usuário sai e, em seguida, desligada novamente quando ele retorna. Se o movimento for detectado pouco antes do usuário retornar, a câmera começará a gravar por um período de tempo predeterminado (ou seja, 10 minutos), mas como o raspivid
comando está bloqueando, eu recebo uma situação em que o usuário está fisicamente em casa, mas o programa está no surveillance
estado. Para contornar isso, inicio um thread para iniciar o raspivid
comando, agora os estados são atualizados corretamente com base em quando o usuário entra e sai. No entanto, agora outros estados não funcionam. Por exemplo, não posso mudar para o TV
estado, pois não consigo gravar imagens em HD e assisti-las ao mesmo tempo. Da mesma forma, não posso mudar para oParty
estado (gravação de vídeo constante das partes), pois a câmera já está gravando.
Solução potencial:
Usando o código que encontrei na web (mas não consigo mais encontrar o link), encontrei um hack pelo qual mato o thread que lançou o raspivid
comando. Infelizmente, isso é considerado blasfêmia pelo SO (veja aqui e aqui ), com o qual concordo não apenas porque pode corromper os .h264
arquivos e causar vazamentos de memória, mas também porque é um pesadelo para mim codificar (tenho que ter bloqueios e semáforos em todos os lugares, já que estou lançando outros threads para detecção de movimento).
Questão:
Existe alguma maneira de parar uma câmera raspi de gravação? Se não, por que não?
popen = subprocess.Popen ( cmd )
epopen.send_signal ( signal.SIGINT )