Esiste un modo per interrompere / mettere in pausa una registrazione attiva / sulla videocamera raspi?


8

L'avvio della Raspi Camera è piuttosto banale:

raspivid -t 10000 -o test.h264

Problema:

Non c'è modo di fermarlo. Questo mi sembra davvero stupido in quanto, per quanto ne sappia, non esiste una fotocamera disponibile per la vendita al dettaglio che richiede all'utente di specificare per quanti secondi eseguire e quindi funziona per molti secondi prima di arrestarsi.

Sfondo:

Ciò presenta un enorme problema di sorveglianza. Sto creando un programma in cui la sorveglianza domestica viene attivata quando l'utente abbandona e quindi si spegne di nuovo al suo ritorno. Se viene rilevato un movimento appena prima che l'utente ritorni, la videocamera inizia a registrare per un periodo di tempo predeterminato (ad es. 10 minuti), ma poiché il raspividcomando sta bloccando, ottengo una situazione in cui l'utente è fisicamente in casa, ma il programma è nello surveillancestato. Per ovviare a questo, lancio un thread per avviare il raspividcomando, quindi ora gli stati vengono aggiornati correttamente in base a quando l'utente va e viene. Tuttavia, ora altri stati non funzionano. Ad esempio, non posso passare allo TVstato in quanto non riesco a registrare filmati HD e guardarli allo stesso tempo. Allo stesso modo, non posso passare aParty stato (registrazione video costante delle parti) poiché la videocamera sta già registrando.

Soluzione potenziale:

Usando il codice che ho trovato sul web (ma non riesco più a trovare il collegamento), ho trovato un hack con cui uccido il thread che ha lanciato il raspividcomando. Sfortunatamente questo è considerato blasfemia da SO (vedi qui e qui ), con cui sono d'accordo non solo perché potrebbe corrompere i .h264file e portare a perdite di memoria, ma anche perché è un incubo per me programmare (devo avere blocchi e semafori ovunque mentre lancio anche altri thread per il rilevamento del movimento).

Domanda:

C'è un modo per fermare una videocamera raspi di registrazione? In caso contrario, perché no?

Risposte:


7

L'ispezione del codice sorgente Raspividrivela che esistono due modi per interrompere l'acquisizione.

Il primo metodo consiste nell'inviare qualsiasi SEGNALE al processo di acquisizione. Il segnale viene elaborato dal seguente codice in 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);
    }

Ciò comporta che il processo di acquisizione termina l'esecuzione in media 100ms.

Come notato nei commenti a questa risposta, ciò può essere realizzato in Python usando il seguente codice:

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

Un altro metodo sarebbe utilizzare il callback dei dati utente, che ha un campo:

    callback_data.abort = 0;

e puoi indovinare cosa succede se imposti questo campo su un valore diverso da zero =)

Se hai bisogno di spiegazioni più dettagliate, vorrei invitarti a controllare il codice sorgente .


Grazie. Tuttavia, non sono sicuro di cosa siano entrambi. È quella C? Avrei dovuto menzionare che il mio codice è Python. Sono riuscito a trovare un modo [molto doloroso] per aggirare questo usando popen = subprocess.Popen ( cmd )epopen.send_signal ( signal.SIGINT )
puk il

bene, l'invio di segnali è il primo approccio di cui ho scritto, scusate se è stato doloroso =)
lenik,

1
di solito i segnali STOP e CONT funzionano bene per questo
John La Rooy,

Cordiali saluti, il codice è stato aggiunto per raspividconsentire l'uso di segnali per controllare la registrazione del video. Ora puoi usare i segnali per mettere in pausa e poi riprendere la registrazione. Non è chiaro se esiste un modo per segnalare l'uscita dal programma e la chiusura del file di output con grazia. Vedi github.com/raspberrypi/userland/pull/104 per maggiori dettagli sulle nuove opzioni che verranno aggiunte raspivid.
Heatfan John

L'ho fatto nel nodo js inviando un segnale SIGTERM per uscire con grazia.
Goofyahead,

2

Provare a utilizzare l' -kopzione (pressione del tasto): Cycle between capture and pause on ENTER.

raspivid -t 10000 -o test.h264 -k

Dopo aver eseguito questo comando, premere 'x' e 'invio' per interrompere il video.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.