Có cách nào để Dừng / Tạm dừng một máy ảnh raspi ghi / tích cực không?


8

Khởi động Camera Raspi khá tầm thường:

raspivid -t 10000 -o test.h264

Vấn đề:

Không có cách nào để ngăn chặn điều này. Điều này có vẻ thực sự ngu ngốc đối với tôi, theo hiểu biết tốt nhất của tôi, không có máy ảnh nào được bán lẻ, đòi hỏi người dùng chỉ định bao nhiêu giây để chạy, và sau đó chạy trong nhiều giây trước khi dừng.

Lý lịch:

Điều này trình bày một vấn đề rất lớn trong giám sát. Tôi đang tạo một chương trình nơi giám sát tại nhà được bật khi người dùng rời đi và sau đó tắt lại khi họ quay lại. Nếu chuyển động được phát hiện ngay trước khi người dùng quay lại, máy ảnh sẽ bắt đầu ghi trong khoảng thời gian định trước (ví dụ: 10 phút), nhưng vì raspividlệnh bị chặn, tôi gặp tình huống người dùng ở trong nhà, nhưng chương trình đang ở trong surveillancebang Để giải quyết vấn đề này, tôi khởi chạy một luồng để khởi chạy raspividlệnh, vì vậy bây giờ các trạng thái được cập nhật chính xác dựa trên thời điểm người dùng đến và đi. Tuy nhiên, bây giờ các tiểu bang khác không hoạt động. Ví dụ: tôi không thể chuyển sang TVtrạng thái vì tôi không thể ghi cảnh HD và xem nó cùng một lúc. Tương tự, tôi không thể chuyển sangParty trạng thái (quay video liên tục của các bên) khi máy ảnh đã ghi.

Giải pháp tiềm năng:

Sử dụng mã tôi tìm thấy trên web (nhưng không thể tìm thấy liên kết đến nữa), tôi đã tìm thấy một bản hack theo đó tôi giết chết chuỗi đã khởi chạy raspividlệnh. Thật không may, điều này được coi là báng bổ bởi SO (xem ở đâyđây ), điều mà tôi đồng ý không chỉ vì nó có thể làm hỏng các .h264tệp và dẫn đến rò rỉ bộ nhớ, mà còn bởi vì đó là cơn ác mộng đối với tôi để mã hóa (tôi phải có khóa và semaphores ở khắp mọi nơi khi tôi đang khởi chạy các chủ đề khác để phát hiện chuyển động là tốt).

Câu hỏi:

Có cách nào để dừng máy ảnh raspi ghi âm không? Nếu không, tai sao không?

Câu trả lời:


7

Kiểm tra mã nguồn để Raspividthấy rằng có hai cách để làm gián đoạn việc chụp.

Phương pháp đầu tiên là gửi bất kỳ TÍN HIỆU nào cho quá trình chụp. Tín hiệu được xử lý bởi đoạn mã sau trong 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);
    }

Điều này dẫn đến trung bình quá trình chụp kết thúc thực hiện trong 100ms.

Như đã lưu ý trong các nhận xét cho câu trả lời này, điều này có thể được thực hiện bằng Python bằng cách sử dụng đoạn mã sau:

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

Một phương pháp khác sẽ sử dụng gọi lại dữ liệu người dùng, có trường:

    callback_data.abort = 0;

và bạn có thể đoán điều gì sẽ xảy ra nếu bạn đặt trường này thành bất cứ thứ gì ngoại trừ zero =)

Nếu bạn cần giải thích chi tiết hơn, tôi muốn mời bạn kiểm tra mã nguồn .


Cảm ơn. Tuy nhiên, tôi không chắc một trong hai thứ đó là gì. Có phải là C không? Tôi nên đã đề cập đến mã của tôi là Python. Tôi đã xoay sở để tìm ra cách [rất đau đớn] bằng cách sử dụng popen = subprocess.Popen ( cmd )popen.send_signal ( signal.SIGINT )
puk

tốt, gửi tín hiệu là cách tiếp cận đầu tiên tôi viết, xin lỗi vì nó rất đau =)
lenik

1
thường tín hiệu STOP và CONT hoạt động tốt cho việc này
John La Rooy

FYI, mã đã được thêm vào raspividđể cho phép sử dụng tín hiệu để kiểm soát việc ghi video. Bây giờ bạn có thể sử dụng tín hiệu để tạm dừng và sau đó tiếp tục ghi âm. Không rõ liệu có cách nào để báo hiệu thoát khỏi chương trình và đóng tệp đầu ra một cách duyên dáng. Xem github.com/raspberrypi/userland/pull/104 để biết thêm chi tiết về các tùy chọn mới được thêm vào raspivid.
HeatfanJohn

Tôi đã thực hiện nó trong nút js gửi tín hiệu SIGTERM để thoát nó một cách duyên dáng.
Goofyahead

2

Hãy thử sử dụng -ktùy chọn (nhấn phím) : Cycle between capture and pause on ENTER.

raspivid -t 10000 -o test.h264 -k

Sau khi thực hiện lệnh này, nhấn 'x' và 'enter' để dừng quay video.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.