Camera bảo mật mã nguồn mở dựa trên Raspberry Pi
(github.com/TzuHuanTai)- Raspberry Pi WebRTC là dự án dựa trên C++20 biến Raspberry Pi hoặc NVIDIA Jetson thành nền tảng streaming WebRTC với độ trễ khoảng 200ms
- Sử dụng WebRTC native và hỗ trợ mã hóa phần cứng/phần mềm, chụp ảnh, ghi hình, phát sóng, điều khiển từ xa và nhắn tin IoT qua WebRTC DataChannel
- Hỗ trợ các phương thức signaling MQTT, WHEP, WebSocket; MQTT được dùng để camera Pi và client trao đổi thông tin kết nối WebRTC
- Thiết bị hỗ trợ gồm Raspberry Pi Zero/3/4/5 và NVIDIA Jetson Nano/NX/Orin; camera có thể dùng CSI hoặc USB và phải hỗ trợ libcamera, libargus, V4L2
- Trên Pi 5 hoặc thiết bị không có bộ mã hóa phần cứng, cần bỏ
--hw-accelkhỏi tùy chọn chạy; WHEP không cần broker nhưng cần hostname công khai
Tổng quan dự án
- Raspberry Pi WebRTC là dự án biến Raspberry Pi hoặc NVIDIA Jetson thành nền tảng streaming WebRTC độ trễ thấp
- Độ trễ mục tiêu được nêu là khoảng 200ms
- Các công nghệ chính được ghi như sau
-
libwebrtc m146.7680
-
C++20
- Giấy phép Apache 2.0
-
Tính năng hỗ trợ
- Cung cấp streaming dựa trên WebRTC native
- Mã hóa video hỗ trợ mã hóa phần cứng và mã hóa phần mềm
- Tính năng camera bao gồm chụp ảnh, ghi hình, phát sóng
- Hỗ trợ điều khiển từ xa và nhắn tin IoT qua WebRTC DataChannel
Phương thức signaling và client
- Hỗ trợ phương thức signaling MQTT
- Hỗ trợ phương thức signaling WHEP
- Hỗ trợ phương thức signaling WebSocket
- picamera.js: xử lý signaling SFU và phát sóng
Yêu cầu
- Bo mạch hỗ trợ là Raspberry Pi Zero/3/4/5 hoặc NVIDIA Jetson Nano/NX/Orin
- Camera có thể dùng camera CSI hoặc USB
- Đầu vào camera phải hỗ trợ libcamera, libargus hoặc V4L2
Bắt đầu nhanh với Raspberry Pi
- Cài đặt Raspberry Pi OS
- Flash Lite OS vào thẻ SD bằng Raspberry Pi Imager
- Cài đặt dependency
- Cài
libmosquitto1,pulseaudio,libavformat61,libswscale8,libyaml-cpp0.8
- Cài
- Tải binary
- Tải release binary mới nhất và giải nén
- Xử lý signaling MQTT
Cách chạy và lưu ý
- Mở picamera-web, thêm cấu hình MQTT rồi tạo
UID - Trên Pi, chạy
./pi-webrtcvà chỉ định camera, FPS, độ phân giải, MQTT host, port, tên người dùng, mật khẩu, UID, v.v. bằng các tùy chọn - Ví dụ tùy chọn bao gồm
--camera=libcamera:0,--fps=30,--width=1280,--height=960,--use-mqtt,--no-audio, v.v. --hw-accellà tùy chọn thêm vào khi dùng mã hóa phần cứng trên Pi Zero 2W, 3B, 4B- Trên Pi 5 hoặc thiết bị không có bộ mã hóa phần cứng, cần bỏ
--hw-accel
Sử dụng nâng cao
- Phát live stream cho hơn 1.000 người xem qua SFU
- Sử dụng driver V4L2: dành cho camera USB
- Chạy dưới dạng Linux service
- Ghi hình
- Giao tiếp âm thanh hai chiều
- Nhắn tin DataChannel hai chiều
- Streaming AI hoặc feed tùy chỉnh thành camera ảo
- Sử dụng Nginx proxy với WHEP
- Sử dụng WebRTC Camera trong Home Assistant
1 bình luận
Ý kiến trên Hacker News
Trước đây tôi cần giám sát từ xa một căn nhà đang cải tạo, nên định lắp một hệ thống an ninh được quảng cáo nhiều mà người quen giới thiệu, nhưng nó không rẻ, và chỉ đến lúc cấu hình tôi mới biết hầu hết tính năng mình muốn đều yêu cầu Internet băng rộng
Không tài liệu marketing nào nói đến điều kiện này, căn nhà đó lại không có Internet, và tôi cũng không định trả thêm ít nhất 60 USD tiền Internet bên cạnh 40 USD/tháng cho hệ thống an ninh
Thay vào đó, tôi gắn camera Raspberry Pi vào chiếc RPi Zero 2W mình có sẵn, rồi mua một hotspot LTE và SIM trả trước T-Mobile 5 USD/tháng
Về phần mềm, tôi dùng imgcomp để chụp ảnh mỗi giây và lưu vào RAM disk; nếu hai ảnh khác nhau ngoài nhiễu, Pi sẽ tải ảnh đã thay đổi lên một thư mục trên VPS, và tôi cấu hình Gotify dùng việc đó làm trigger để gửi thông báo kèm liên kết ảnh về điện thoại
Nhìn chung đúng là một cấu hình kiểu Rube Goldberg, nhưng nó đã hoạt động gần như hoàn hảo trong vài năm
Trước đây tôi cũng đang làm một thứ tương tự https://youtube.com/watch?v=5E7_40PWqiQ
Khi đang xây nhà, tôi sống ở căn hộ, và muốn dùng camera để tạo video timelapse, đồng thời cho phép truy cập qua Internet để xem thợ thuyền đang làm gì
Đáng tiếc là cứ mỗi ý tưởng tôi nghĩ ra thì đã có ai đó, trong trường hợp này là phía Trung Quốc, làm sẵn rồi. Trên AliExpress có những camera khá ổn làm được các tính năng này và còn hơn thế nữa, hoàn thiện cũng tốt hơn cái vỏ vụng về in 3D
Ước mơ của tôi là làm một thiết bị như vậy và cho phép truy cập từ xa qua Tor. Như thế có thể giữ nó hoàn toàn cục bộ mà vẫn truy cập từ xa từ bất kỳ đâu trên thế giới
Một dự án thay thế tôi đang xem để dùng trên Raspberry Pi Zero WH là mediamtx
https://github.com/bluenviron/mediamtx?tab=readme-ov-file#raspberry-pi-cameras
Đây là một ví dụ tận dụng WebRTC tốt, và lạ là WebRTC vẫn chưa được dùng đủ nhiều
Nếu tự host và muốn truy cập từ xa đến máy chủ signaling qua dữ liệu di động, bạn có thể cần thiết lập DDNS và port forwarding nếu ISP cấp IP động
Tuy nhiên cách này sẽ để lộ máy chủ ra Internet. Thay vào đó, có thể dùng một giải pháp nguồn mở tạo kết nối riêng giữa Pi và máy chủ. Khi đó không cần mở quyền truy cập mạng vào máy chủ, cũng không cần IP tĩnh hay port forwarding
Tôi tò mò vì sao WebRTC lại gặp khó khăn trong việc trở nên phổ biến. Có phải do chất lượng phần mềm, tài liệu hướng dẫn hay vấn đề tương tự không? Tôi luôn tìm các dự án mới
Tôi không hiểu lắm đoạn Raspberry Pi 5 không hỗ trợ mã hóa phần cứng v4l2. Giải mã video thì họ đã đầu tư công phu đưa vào, vậy tại sao lại không có encoder?
Encode và decode có phần chồng lấn, nhưng khi làm với codec Opus, cũng có khá nhiều mã chỉ thuộc về một trong hai luồng xử lý
Đúng thứ tôi đang tìm. Tôi định chạy phát hiện người
Tôi đang dùng yolov3-tiny; nó không phải mới nhất nhưng là một mô hình machine learning thị giác máy tính rất nhẹ, và hiện tôi đang tối ưu hiệu năng suy luận bằng C++ để phát hiện người theo thời gian thực quanh nhà
Tôi muốn nếu ban đêm có ai đi vào khu đất thì còi báo động và đèn sẽ tự bật để xua đuổi kẻ đột nhập
https://github.com/jmaczan/yolov3-tiny-openvino
Tôi từng tưởng tượng một cách bật đèn và còi tăng dần khi đối tượng tiến lại gần. Như vậy có thể phản ứng sớm hơn nhiều, đồng thời cho kẻ có khả năng đột nhập đủ tín hiệu để rút lui
Tăng adrenaline từ từ trong một vòng phản hồi có vẻ hiệu quả hơn. Vì một hiệu ứng đột ngột thì chỉ cần đánh giá một lần là xong
Gần đây tôi đã làm một thiết bị ghi âm luôn bật. Mục đích chính là ghi âm liên tục đều đặn, không phải để giám sát, mà dành cho nhạc sĩ và người sáng tạo không muốn phải nhớ bấm nút ghi âm giữa một màn trình diễn hay
Tôi dùng Zero-W, một shell script hơi phức tạp xử lý
arecord/aplay, cùng frontend turboLua, và nó chạy khá tốtNó ghi liên tục nhưng chỉ xóa phần âm thanh “cũ” sau thời hạn lưu giữ do người dùng đặt; các tùy chọn gồm 1 phút, 5 phút, 15 phút, 30 phút, 1 giờ, 3 giờ, 5 giờ, đến 24 giờ
Tôi cũng làm một frontend cho phép người dùng Keep những khoảng thời gian mà họ cảm thấy đã thu được thứ gì đó hay. Heuristic này giống với cơ chế dead man’s switch/camera an ninh của nhiều sản phẩm giám sát
Nó hoạt động tốt đến mức tôi tự hỏi vì sao nó vẫn chưa trở thành một thứ gần như tiêu chuẩn. Có vẻ vẫn còn một ưu tiên mang tính kinh tế là không muốn lấp đầy dung lượng lưu trữ, nhưng ngày nay 128GB cũng trụ được khá lâu
Tôi nghĩ một ngày nào đó cách này sẽ trở nên phổ biến. Cứ lắp đặt rồi quên đi, jam vài tiếng, quay lại tìm những gì muốn giữ, còn phần dọn dẹp còn lại đã tự xử lý xong; khá truyền cảm hứng
Cũng đừng quên dự án RPi Cam Web Interface cũ. Nó đã khá lâu đời nhưng vẫn đang chạy trên các Pi của tôi
Tôi chạy nó trong môi trường vận hành liên tục để không làm hỏng thẻ SD, còn phần lưu trữ thì gửi lên server. Giao diện cũng gọn gàng
https://elinux.org/RPi-Cam-Web-Interface
Tôi đang dùng rất tốt https://github.com/TinkerTurtle/Sentry-Picam cho mục đích tương tự
Thư mục ảnh/video đã ghi được đồng bộ bằng syncthing với 3 máy khác để có tính dự phòng, và tôi gắn thêm script thông báo đẩy dựa trên
sendxmppđể khi có chuyện xảy ra thì nhận cảnh báo theo thời gian thực trên mọi thiết bịKhá hay. Trước đây tôi từng làm một thứ tương tự ở https://securade.ai bằng cách dùng Nvidia Jetson làm thiết bị edge
Giờ tôi đang mong chờ reCamera: https://www.seeedstudio.com/blog/recamera/