1 điểm bởi GN⁺ 2024-09-17 | 1 bình luận | Chia sẻ qua WhatsApp
  • Dự án biến Raspberry Pi thành camera an ninh gia đình độ trễ thấp
    • Sử dụng bộ mã hóa phần cứng v4l2DMA và WebRTC
    • Có thể phát lại và tải xuống video bằng camera thuần P2P mà không cần media server
    • Nhiều người dùng có thể xem luồng trực tiếp cùng lúc
    • Raspberry Pi 5 hoặc các SBC khác không hỗ trợ mã hóa phần cứng v4l2, cần chạy ở chế độ mã hóa phần mềm

Cách sử dụng

  • Tải tệp nhị phân mới nhất từ Releases
  • Cài đặt ứng dụng Pi Camera và làm theo hướng dẫn

Yêu cầu phần cứng

  • Raspberry Pi (Zero 2W trở lên)
  • Mô-đun camera CSI
  • Thẻ micro SD tối thiểu 4GB
  • Ổ đĩa USB và bộ chuyển đổi Micro-USB Male sang USB-A Female

Thiết lập môi trường

  1. Dùng Raspberry Pi Imager để ghi Lite OS (Bookworm 64-bit) vào thẻ micro SD
  2. Cài đặt các thư viện cần thiết
    sudo apt install libmosquitto1 pulseaudio libavformat59 libswscale6
    
  3. Thêm nội dung bên dưới vào /boot/firmware/config.txt để kích hoạt phần cứng Raspberry Pi
    camera_auto_detect=0
    start_x=1
    gpu_mem=16
    
    Đặt camera_auto_detect=0 để đọc camera qua v4l2
  4. Mount ổ USB [tham khảo]
    • Nếu không muốn ghi video, hãy bỏ qua bước này và không đặt cờ record_path khi chạy
    • Khi ổ đĩa được phát hiện, nó sẽ tự động được mount vào /mnt/ext_disk
    sudo apt-get install autofs
    echo '/- /etc/auto.usb --timeout=5' | sudo tee -a /etc/auto.master > /dev/null
    echo '/mnt/ext_disk -fstype=auto,nofail,nodev,nosuid,noatime,umask=000 :/dev/sda1' | sudo tee -a /etc/auto.usb > /dev/null
    sudo systemctl restart autofs
    

Chạy ứng dụng

  • Hiện tại MQTT là cơ chế signaling duy nhất được sử dụng, nên cần chuẩn bị máy chủ MQTT trước khi khởi động ứng dụng
  • Nếu ứng dụng chỉ dùng trong LAN, có thể cài máy chủ MQTT như Mosquitto ngay trên cùng Pi đó
  • Nếu cần truy cập từ xa, nên dùng máy chủ MQTT trên đám mây (ví dụ: HiveMQ, EXMQ)
  • Để truy cập máy chủ signaling từ xa qua dữ liệu di động, cần cấu hình DDNS và port forwarding

Chạy

  • Có thể chạy tệp nhị phân pi_webrtc với cờ -h để xem toàn bộ tùy chọn
  • Áp dụng cấu hình rồi khởi động ứng dụng
    pulseaudio --start
    /path/to/pi_webrtc --device=/dev/video0 --fps=30 --width=1280 --height=960 --v4l2_format=h264 --hw_accel --mqtt_host=example.s1.eu.hivemq.cloud --mqtt_port=8883 --mqtt_username=hakunamatata --mqtt_password=Wonderful --uid=home-pi-zero2w --record_path=/mnt/ext_disk/video/
    
    Mẹo 1: Pi 5 không hỗ trợ mã hóa phần cứng, vì vậy hãy bỏ cờ --hw_accel và đặt --v4l2_format thành mjpeg. Việc mã hóa video sẽ do OpenH264 xử lý Mẹo 2: Khi đặt 1920x1080, firmware của bộ giải mã phần cứng sẽ đổi thành 1920x1088, nhưng isp/encoder không được điều chỉnh nên vượt phạm vi bộ nhớ. Đặt 1920x1088 sẽ không gặp vấn đề này

Chạy như dịch vụ Linux

1. Chạy pulseaudio như daemon toàn hệ thống [tham khảo]
  • Tạo tệp /etc/systemd/system/pulseaudio.service
    [Unit]
    Description= Pulseaudio Daemon
    After=rtkit-daemon.service systemd-udevd.service dbus.service
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/pulseaudio --system --disallow-exit --disallow-module-loading
    Restart=always
    RestartSec=10
    
    [Install]
    WantedBy=multi-user.target
    
  • Thêm autospawn = no vào cấu hình client
    echo 'autospawn = no' | sudo tee -a /etc/pulse/client.conf > /dev/null
    
  • Thêm root vào nhóm pulse
    sudo adduser root pulse-access
    
  • Kích hoạt và khởi động dịch vụ
    sudo systemctl daemon-reload
    sudo systemctl enable pulseaudio.service
    sudo systemctl start pulseaudio.service
    
2. Chạy pi_webrtc và thiết lập tự khởi động khi reboot
  • Tạo tệp /etc/systemd/system/pi-webrtc.service
    [Unit]
    Description= The p2p camera via webrtc.
    After=systemd-networkd.service
    
    [Service]
    Type=simple
    WorkingDirectory=/path/to
    ExecStart=/path/to/pi_webrtc --device=/dev/video0 --fps=30 --width=1280 --height=960 --v4l2_format=h264 --hw_accel --mqtt_host=example.s1.eu.hivemq.cloud --mqtt_port=8883 --mqtt_username=hakunamatata --mqtt_password=wonderful --record_path=/mnt/ext_disk/video/
    Restart=always
    RestartSec=10
    
    [Install]
    WantedBy=multi-user.target
    
  • Kích hoạt và khởi động dịch vụ
    sudo systemctl daemon-reload
    sudo systemctl enable pi-webrtc.service
    sudo systemctl start pi-webrtc.service
    

Cấu hình nâng cao

  • Cần thêm micro và loa để giao tiếp hai chiều

Micro

  • Xem liên kết để biết hướng dẫn đấu nối và kiểm tra micro

Loa

  • Xem liên kết để biết hướng dẫn thiết lập loa

Giấy phép

  • Dự án này được cấp phép theo Apache License, Version 2.0. Xem tệp LICENSE để biết chi tiết

Tóm tắt của GN⁺

  • Dự án này cung cấp cách biến Raspberry Pi thành camera an ninh gia đình độ trễ thấp
  • Sử dụng bộ mã hóa phần cứng v4l2DMA và WebRTC để vận hành thuần P2P mà không cần media server
  • Nhiều người dùng có thể xem luồng trực tiếp cùng lúc, hữu ích cho camera an ninh gia đình
  • Cơ chế signaling dùng MQTT hỗ trợ cả LAN lẫn truy cập từ xa
  • Các dự án khác có tính năng tương tự gồm MotionEye và ZoneMinder

1 bình luận

 
GN⁺ 2024-09-17
Ý kiến trên Hacker News
  • Một người dùng cho biết trong lúc sửa nhà, họ định lắp một hệ thống an ninh để giám sát từ xa nhưng phát hiện ra rằng phần lớn tính năng đều cần Internet băng thông rộng

    • Thay vào đó, họ tự xây dựng hệ thống bằng Raspberry Pi Camera, RPi Zero 2W, điểm phát LTE và SIM trả trước $5/tháng của T-Mobile
    • Về phần mềm, họ dùng imgcomp để chụp ảnh mỗi giây, tải ảnh đã thay đổi lên VPS và nhận thông báo trên điện thoại qua Gotify
  • Một người dùng khác sống ở căn hộ trong khi xây nhà và muốn tạo video timelapse cũng như kiểm tra tiến độ công việc qua Internet

    • Họ đã tìm được camera chất lượng tốt hơn trên AliExpress
  • Một người dùng khác nữa đã cân nhắc dự án mediamtx với Raspberry Pi Zero WH

    • Đây là một ví dụ hay về việc tận dụng WebRTC, dù có thể cần cấu hình DDNS và port forwarding
    • Có thể dùng giải pháp mã nguồn mở để tạo kết nối riêng tư giữa Pi và máy chủ
  • Một người dùng thắc mắc vì sao Raspberry Pi 5 không hỗ trợ mã hóa phần cứng v4l2

  • Một người dùng khác đang thử nhận diện người theo thời gian thực bằng mô hình yolov3-tiny

    • Họ đang cố tối đa hóa hiệu năng bằng C++
  • Một người dùng khác nữa đã đạt được mục đích tương tự bằng Sentry-Picam, đồng bộ với 3 thiết bị khác qua Syncthing và nối một script thông báo đẩy dựa trên sendxmpp

  • Một người dùng đã thực hiện dự án tương tự bằng Nvidia Jetson và hiện đang quan tâm đến reCamera

  • Một người dùng khác đang tìm một bo mạch sử dụng firmware mã nguồn mở

  • Cuối cùng, một người dùng thắc mắc liệu WebRTC có phải là giải pháp tốt nếu chỉ muốn ghi âm thanh hay không