Есть ли способ остановить / приостановить активно запись / на распи камеру?

8

Запуск камеры Raspi довольно тривиален:

raspivid -t 10000 -o test.h264

Проблема:

Нет способа остановить это. Это кажется мне действительно глупым, поскольку, насколько мне известно, нет камеры, доступной для розничной торговли, которая требует, чтобы пользователь указал, сколько секунд будет работать, а затем работает в течение этих многих секунд, прежде чем остановиться.

Фон:

Это представляет огромную проблему в наблюдении. Я создаю программу, в которой домашнее наблюдение включается, когда пользователь уходит, а затем снова выключается, когда он возвращается. Если движение обнаруживается непосредственно перед тем, как пользователь возвращается, камера начинает запись в течение заранее определенного периода времени (т. Е. 10 минут), но поскольку raspividкоманда блокируется, я получаю ситуацию, когда пользователь физически находится в доме, но программа находится в surveillanceсостоянии. Чтобы обойти это, я запускаю поток для запуска raspividкоманды, поэтому теперь состояния корректно обновляются в зависимости от того, когда пользователь приходит и уходит. Однако сейчас другие штаты не работают. Например, я не могу переключиться в TVсостояние, так как я не могу записывать HD-видео и одновременно смотреть его. Точно так же я не могу переключиться наParty состояние (постоянная видеозапись участников), так как камера уже записывает.

Потенциальное решение:

Используя код, который я нашел в сети (но больше не могу найти ссылку на него), я нашел хак, в результате которого я убил поток, запустивший raspividкоманду. К сожалению, SO считает это богохульством (см. Здесь и здесь ), с чем я согласен не только потому, что это может повредить .h264файлы и привести к утечке памяти, но также и потому, что для меня это кошмарный код (у меня должны быть блокировки и везде семафоры, так как я запускаю и другие потоки для обнаружения движения).

Вопрос:

Есть ли способ остановить запись распи камеры? Если нет, то почему?

PUK
источник

Ответы:

7

Изучение исходного кода Raspividпоказывает, что существует два способа прервать захват.

Первый способ - отправить любой сигнал в процесс захвата. Сигнал обрабатывается следующим кодом в 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);
    }

В результате процесс захвата завершается в среднем за 100 мс.

Как отмечено в комментариях к этому ответу, это может быть выполнено в Python с помощью следующего кода:

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

Другой метод будет использовать обратный вызов пользовательских данных, который имеет поле:

    callback_data.abort = 0;

и вы можете догадаться, что произойдет, если вы установите это поле на что угодно, кроме нуля =)

Если вам нужно более подробное объяснение, я бы хотел пригласить вас проверить исходный код .

Lenik
источник
Спасибо. Тем не менее, я не уверен, что из этого. Это С? Я должен был упомянуть мой код Python. Мне удалось найти [очень болезненный] способ обойти это, используя popen = subprocess.Popen ( cmd )иpopen.send_signal ( signal.SIGINT )
puk
хорошо, отправка сигналов - первый подход, о котором я писал, извините, что это было больно =)
lenik
1
обычно для этого нормально работают сигналы STOP и CONT
Джон Ла Рой
К вашему сведению, был добавлен код, raspividпозволяющий использовать сигналы для управления записью видео. Теперь вы можете использовать сигналы для приостановки и возобновления записи. Неясно, есть ли способ сигнализировать о выходе из программы и корректном закрытии выходного файла. См. Github.com/raspberrypi/userland/pull/104 для получения дополнительной информации о новых добавляемых опциях raspivid.
HeatfanJohn
Я сделал это в узле js, посылая сигнал SIGTERM, чтобы выйти из него изящно.
Гуфигхед
2

Попробуйте использовать -kопцию (нажатие): Cycle between capture and pause on ENTER.

raspivid -t 10000 -o test.h264 -k

После выполнения этой команды нажмите «x» и «enter», чтобы остановить видеосъемку.

Уги Прашант Гопал
источник