Existe uma maneira de parar / pausar uma gravação ativa / na câmera raspi?

8

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 raspividcomando está bloqueando, eu recebo uma situação em que o usuário está fisicamente em casa, mas o programa está no surveillanceestado. Para contornar isso, inicio um thread para iniciar o raspividcomando, 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 TVestado, 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 raspividcomando. Infelizmente, isso é considerado blasfêmia pelo SO (veja aqui e aqui ), com o qual concordo não apenas porque pode corromper os .h264arquivos 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?

puk
fonte

Respostas:

7

A inspeção do código fonte Raspividrevela que existem duas maneiras de interromper a captura.

O primeiro método é enviar qualquer SINAL para o processo de captura. O sinal é processado pelo seguinte código em 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);
    }

Isso resulta no processo de captura, finalizando a execução em 100ms, em média.

Conforme observado nos comentários a esta resposta, isso pode ser feito no Python, usando o seguinte código:

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

Outro método seria usar o retorno de chamada de dados do usuário, que possui o campo:

    callback_data.abort = 0;

e você pode adivinhar o que acontece se você definir esse campo para qualquer coisa, exceto zero =)

Se você precisar de explicações mais detalhadas, gostaria de convidá-lo para verificar o código-fonte .

lenik
fonte
Obrigado. No entanto, não tenho certeza do que sejam. Isso é C? Eu deveria ter mencionado meu código é Python. Eu consegui encontrar uma maneira [muito dolorosa] em torno deste usando popen = subprocess.Popen ( cmd )epopen.send_signal ( signal.SIGINT )
puk
bem, o envio de sinais é a primeira abordagem sobre a qual escrevi, desculpe, foi doloroso =) #
1119
11
geralmente param e CONT sinaliza trabalho ok para este
John La Rooy
Para sua informação, código foi adicionado para raspividpermitir o uso de sinais para controlar a gravação do vídeo. Agora você pode usar sinais para pausar e depois retomar a gravação. Não está claro se há uma maneira de sinalizar para sair do programa e fechar o arquivo de saída normalmente. Consulte github.com/raspberrypi/userland/pull/104 para obter mais detalhes sobre as novas opções que estão sendo adicionadas raspivid.
HeatfanJohn
Eu fiz isso no nó js enviando um sinal SIGTERM para sair normalmente.
Goofyahead 13/01
2

Tente usar a -kopção (pressão): Cycle between capture and pause on ENTER.

raspivid -t 10000 -o test.h264 -k

Após executar este comando, pressione 'x' e 'enter' para interromper a gravação do vídeo.

Ugi Prashanth Gopal
fonte