¿Hay alguna manera de detener / pausar una grabación activa / en cámara raspi?

8

Iniciar la cámara Raspi es bastante trivial:

raspivid -t 10000 -o test.h264

Problema:

No hay forma de detener esto. Esto me parece realmente estúpido ya que, a mi leal saber y entender, no hay una cámara disponible para la venta minorista que requiera que el usuario especifique cuántos segundos debe correr, y luego corre durante esos segundos antes de detenerse.

Antecedentes:

Esto presenta un gran problema en la vigilancia. Estoy creando un programa donde la vigilancia en el hogar se activa cuando el usuario se va, y luego se apaga nuevamente cuando regresa. Si se detecta movimiento justo antes de que el usuario regrese, la cámara comienza a grabar durante un período de tiempo predeterminado (es decir, 10 minutos), pero dado que el raspividcomando está bloqueando, obtengo una situación en la que el usuario está físicamente en la casa, pero el programa Está en el surveillanceestado. Para evitar esto, lanzo un hilo para ejecutar el raspividcomando, por lo que ahora los estados se actualizan correctamente en función de cuándo va y viene el usuario. Sin embargo, ahora otros estados no funcionan. Por ejemplo, no puedo cambiar al TVestado ya que no puedo grabar imágenes en HD y verlas al mismo tiempo. Del mismo modo, no puedo cambiar alParty estado (grabación de video constante de fiestas) ya que la cámara ya está grabando.

Solucion potencial:

Usando el código que encontré en la web (pero ya no puedo encontrar el enlace), encontré un truco mediante el cual elimino el hilo que lanzó el raspividcomando. Desafortunadamente, esto es considerado una blasfemia por SO (ver aquí y aquí ), con lo que estoy de acuerdo no solo porque podría corromper los .h264archivos y provocar pérdidas de memoria, sino también porque es una pesadilla para mí codificar (tengo que tener bloqueos y semáforos en todas partes ya que estoy lanzando otros hilos para la detección de movimiento también).

Pregunta:

¿Hay alguna manera de detener una cámara raspi de grabación? ¿Si no, porque no?

puk
fuente

Respuestas:

7

La inspección del código fuente Raspividrevela que hay dos formas de interrumpir la captura.

El primer método es enviar cualquier SEÑAL al proceso de captura. La señal es procesada por el siguiente código en 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);
    }

Esto da como resultado que el proceso de captura finalice la ejecución en 100 ms en promedio.

Como se señaló en los comentarios a esta respuesta, esto se puede lograr en Python utilizando el siguiente código:

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

Otro método sería utilizar la devolución de llamada de datos del usuario, que tiene campo:

    callback_data.abort = 0;

y puede adivinar qué sucede si establece este campo en cualquier cosa excepto cero =)

Si necesita una explicación más detallada, me gustaría invitarlo a verificar el código fuente .

lenik
fuente
Gracias. Sin embargo, no estoy seguro de cuáles son esos. ¿Eso es C? Debería haber mencionado que mi código es Python. Me las arreglé para encontrar una forma [muy dolorosa] de evitar esto usando popen = subprocess.Popen ( cmd )ypopen.send_signal ( signal.SIGINT )
puk
bueno, enviar señales es el primer enfoque sobre el que escribí, lo siento, fue doloroso =)
lenik
1
por lo general STOP y CONT señales bien el trabajo para este
John La Rooy
Para su información, se ha agregado un código raspividpara permitir el uso de señales para controlar la grabación del video. Ahora puede usar señales para pausar y luego reanudar la grabación. No está claro si hay una manera de señalar que sale del programa y cierra el archivo de salida con gracia. Visite github.com/raspberrypi/userland/pull/104 para obtener más detalles sobre las nuevas opciones que se están agregando raspivid.
HeatfanJohn
Lo hice en el nodo js enviando una señal SIGTERM para salir con gracia.
Goofyahead
2

Trate de usar la -kopción (pulsación): Cycle between capture and pause on ENTER.

raspivid -t 10000 -o test.h264 -k

Después de ejecutar este comando, presione 'x' y 'enter' para detener la grabación.

Ugi Prashanth Gopal
fuente