1 điểm bởi GN⁺ 2024-09-17 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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-accel khỏ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

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
  • Cài đặt dependency
    • Cài libmosquitto1, pulseaudio, libavformat61, libswscale8, libyaml-cpp0.8
  • Tải binary
  • Xử lý signaling MQTT
    • Có thể dùng HiveMQ, EMQX, hoặc broker tự host
    • MQTT cho phép camera Pi và client trao đổi thông tin kết nối WebRTC
    • WHEP không cần broker nhưng cần hostname công khai

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-webrtc và 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-accel là 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

1 bình luận

 
GN⁺ 2024-09-17
Ý 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

    • “Hệ thống an ninh không rẻ” và “hệ thống khoảng 40 USD” nghe không khớp lắm. Không rõ người viết kỳ vọng hệ thống an ninh phải rẻ đến mức nào
    • Tôi thấy đây đúng là cách làm rất hợp với tinh thần mày mò và hacker. Có nhu cầu thì tự tạo giải pháp bằng những thứ sẵn có, và tôi cũng không thấy nó quá kiểu Rube Goldberg
    • Họ kỳ vọng có thể giám sát camera qua Internet mà không có kết nối Internet sao? Đọc như thể họ mong camera có sẵn LTE mà không cần thuê bao vậy
    • Cấu hình khá ổn. Nếu là hiện nay thì có lẽ có thể gắn thêm module Coral dựa trên GPU hoặc TPU của codeproject.ai phía sau để xử lý
  • 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

    • Một số, có thể là đa số hoặc tất cả, các thiết bị kiểu này cần dịch vụ bên ngoài. Nghĩa là chúng chỉ hoạt động chừng nào dịch vụ đó còn tồn tại và bạn bị phụ thuộc vào nhà cung cấp
      Ướ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

    • Được thấy WebRTC phát huy hết tiềm năng là niềm đam mê cả đời của tôi. Sau khi biết đến P2P/NAT traversal, tôi không thể quay lại như trước nữa
      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
    • Dựng một MQTT server trên Pi là giải quyết được vấn đề :)
  • 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?

    • Tôi đoán là vì số người encode ít hơn rất nhiều so với số người decode
      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ý
    • Họ đã quyết định dùng diện tích silicon cho việc khác. CPU Pi 5 đủ mạnh để giải mã bằng phần mềm hầu hết luồng H.264, và Pi 5 có bộ giải mã phần cứng H.265
  • Đú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 hình dung cảnh báo động kêu ngẫu nhiên lúc nửa đêm
      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ốt
    Nó 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/