Apakah ada cara untuk Menghentikan / Menjeda kamera yang aktif merekam / menggunakan raspi?

8

Memulai Kamera Raspi agak sepele:

raspivid -t 10000 -o test.h264

Masalah:

Tidak ada cara untuk menghentikan ini. Ini tampak sangat bodoh bagi saya karena, setahu saya, tidak ada kamera yang tersedia untuk ritel yang mengharuskan pengguna untuk menentukan berapa detik untuk menjalankan, dan kemudian berjalan selama beberapa detik sebelum berhenti.

Latar Belakang:

Ini menghadirkan masalah besar dalam pengawasan. Saya membuat program di mana pengawasan rumah diaktifkan ketika pengguna pergi, dan kemudian mati lagi ketika mereka kembali. Jika gerakan terdeteksi tepat sebelum pengguna kembali, kamera mulai merekam untuk jangka waktu yang telah ditentukan (mis. 10 menit), tetapi karena raspividperintahnya memblokir, saya mendapatkan situasi di mana pengguna secara fisik berada di dalam rumah, tetapi program berada di surveillancenegara bagian. Untuk menyiasatinya, saya meluncurkan utas untuk meluncurkan raspividperintah, jadi sekarang status diperbarui dengan benar berdasarkan kapan pengguna datang dan pergi. Namun, sekarang negara bagian lain tidak berfungsi. Misalnya, saya tidak dapat beralih ke TVkeadaan karena saya tidak dapat merekam rekaman HD dan menontonnya secara bersamaan. Demikian pula, saya tidak bisa beralih keParty status (perekaman video pihak-pihak yang konstan) karena kamera sudah merekam.

Solusi Potensial:

Dengan menggunakan kode yang saya temukan di web (tetapi tidak dapat menemukan tautannya lagi), saya menemukan sebuah retasan di mana saya membunuh utas yang meluncurkan raspividperintah. Sayangnya ini dianggap penistaan ​​oleh SO (lihat di sini dan di sini ), yang saya setujui bukan hanya karena dapat merusak .h264file dan menyebabkan kebocoran memori, tetapi juga karena itu adalah mimpi buruk bagi saya untuk kode (saya harus memiliki kunci dan semaphores di mana-mana karena saya meluncurkan utas lain untuk deteksi gerakan juga).

Pertanyaan:

Apakah ada cara untuk menghentikan rekaman kamera raspi? Jika tidak, mengapa tidak?

puk
sumber

Jawaban:

7

Memeriksa kode sumber untuk Raspividmengungkapkan bahwa ada dua cara untuk menghentikan penangkapan.

Metode pertama adalah mengirim SIGNAL apa pun ke proses penangkapan. Sinyal diproses oleh kode berikut di 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);
    }

Ini menghasilkan proses penangkapan yang mengakhiri eksekusi rata-rata dalam 100 ms.

Seperti disebutkan dalam komentar untuk jawaban ini, ini dapat dicapai dengan Python dengan menggunakan kode berikut:

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

Metode lain akan menggunakan panggilan balik data pengguna, yang memiliki bidang:

    callback_data.abort = 0;

dan Anda dapat menebak apa yang terjadi jika Anda menyetel bidang ini ke apa pun kecuali nol =)

Jika Anda membutuhkan penjelasan lebih rinci, saya ingin mengundang Anda untuk memeriksa kode sumber .

lenik
sumber
Terima kasih. Namun, saya tidak yakin keduanya. Apakah itu C? Saya seharusnya menyebutkan kode saya adalah Python. Saya berhasil menemukan jalan [yang sangat menyakitkan] dalam hal ini dengan menggunakan popen = subprocess.Popen ( cmd )danpopen.send_signal ( signal.SIGINT )
puk
baik, mengirim sinyal adalah pendekatan pertama yang saya tulis, maaf itu menyakitkan =)
lenik
1
biasanya sinyal STOP dan CONT berfungsi dengan baik untuk ini
John La Rooy
FYI, kode telah ditambahkan untuk raspividmemungkinkan penggunaan sinyal untuk mengontrol perekaman video. Anda sekarang dapat menggunakan sinyal untuk berhenti dan kemudian melanjutkan perekaman. Tidak jelas apakah ada cara untuk memberi sinyal keluar dari program dan menutup file output dengan anggun. Lihat github.com/raspberrypi/userland/pull/104 untuk detail lebih lanjut tentang opsi baru yang ditambahkan raspivid.
HeatfanJohn
Saya membuatnya di node js mengirim sinyal SIGTERM untuk keluar dengan anggun.
Goofyahead
2

Coba gunakan -k(tekan) pilihan: Cycle between capture and pause on ENTER.

raspivid -t 10000 -o test.h264 -k

Setelah menjalankan perintah ini tekan 'x' dan 'enter' untuk menghentikan video.

Ugi Prashanth Gopal
sumber