1 คะแนน โดย GN⁺ 2024-09-17 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • โปรเจ็กต์ที่เปลี่ยน Raspberry Pi ให้เป็นกล้องรักษาความปลอดภัยภายในบ้านแบบหน่วงต่ำ
    • ใช้ตัวเข้ารหัสฮาร์ดแวร์ v4l2DMA และ WebRTC
    • เล่นและดาวน์โหลดวิดีโอได้ในรูปแบบกล้อง P2P ล้วนโดยไม่ต้องมีมีเดียเซิร์ฟเวอร์
    • ผู้ใช้หลายคนสามารถรับชมไลฟ์สตรีมพร้อมกันได้
    • Raspberry Pi 5 หรือ SBC อื่น ๆ ไม่รองรับการเข้ารหัสฮาร์ดแวร์ v4l2 จึงต้องรันในโหมดเข้ารหัสด้วยซอฟต์แวร์

วิธีใช้งาน

  • ดาวน์โหลดไฟล์ไบนารีล่าสุดจาก Releases
  • ติดตั้งแอป Pi Camera และทำตามคำแนะนำ

ข้อกำหนดฮาร์ดแวร์

  • Raspberry Pi (Zero 2W ขึ้นไป)
  • โมดูลกล้อง CSI
  • การ์ด micro SD อย่างน้อย 4GB
  • ดิสก์ USB และอะแดปเตอร์ Micro-USB Male to USB-A Female

การตั้งค่าสภาพแวดล้อม

  1. ใช้ Raspberry Pi Imager เขียน Lite OS (Bookworm 64-bit) ลงในการ์ด micro SD
  2. ติดตั้งไลบรารีที่จำเป็น
    sudo apt install libmosquitto1 pulseaudio libavformat59 libswscale6
    
  3. เพิ่มเนื้อหาด้านล่างลงใน /boot/firmware/config.txt เพื่อเปิดใช้งานฮาร์ดแวร์ Raspberry Pi
    camera_auto_detect=0
    start_x=1
    gpu_mem=16
    
    ตั้งค่า camera_auto_detect=0 เพื่อให้อ่านกล้องผ่าน v4l2
  4. เมานต์ดิสก์ USB [อ้างอิง]
    • หากไม่ต้องการบันทึกวิดีโอ ให้ข้ามขั้นตอนนี้และไม่ต้องตั้งค่าแฟลก record_path ตอนรัน
    • เมื่อระบบตรวจพบดิสก์ไดรฟ์ จะถูกเมานต์อัตโนมัติที่ /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
    

การรันแอปพลิเคชัน

  • ปัจจุบัน MQTT เป็นกลไก signaling เพียงอย่างเดียว จึงต้องเตรียมเซิร์ฟเวอร์ MQTT ก่อนเริ่มแอปพลิเคชัน
  • หากใช้งานแอปพลิเคชันเฉพาะภายใน LAN สามารถติดตั้งเซิร์ฟเวอร์ MQTT เช่น Mosquitto บน Pi เครื่องเดียวกันได้
  • หากต้องการรีโมตแอ็กเซส แนะนำให้ใช้เซิร์ฟเวอร์ MQTT แบบคลาวด์ (เช่น HiveMQ, EXMQ)
  • หากต้องการเข้าถึงเซิร์ฟเวอร์ signaling ระยะไกลผ่านเครือข่ายมือถือ ต้องตั้งค่า DDNS และพอร์ตฟอร์เวิร์ดดิ้ง

การรัน

  • สามารถรันไฟล์ไบนารี pi_webrtc พร้อมแฟลก -h เพื่อดูตัวเลือกทั้งหมด
  • เริ่มแอปพลิเคชันด้วยการตั้งค่าที่ต้องการ
    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/
    
    เคล็ดลับ 1: Pi 5 ไม่รองรับการเข้ารหัสด้วยฮาร์ดแวร์ จึงต้องเอาแฟลก --hw_accel ออกและตั้งค่า --v4l2_format เป็น mjpeg การเข้ารหัสวิดีโอจะจัดการโดย OpenH264 เคล็ดลับ 2: เมื่อตั้งค่าเป็น 1920x1080 เฟิร์มแวร์ฮาร์ดแวร์ดีโคเดอร์จะเปลี่ยนเป็น 1920x1088 แต่ isp/encoder ไม่ได้ปรับตาม ทำให้หน่วยความจำเกินขอบเขต หากตั้งเป็น 1920x1088 จะไม่มีปัญหา

การรันเป็นบริการ Linux

1. รัน pulseaudio เป็นเดมอนทั้งระบบ [อ้างอิง]
  • สร้างไฟล์ /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
    
  • เพิ่ม autospawn = no ในการตั้งค่าไคลเอนต์
    echo 'autospawn = no' | sudo tee -a /etc/pulse/client.conf > /dev/null
    
  • เพิ่ม root เข้าไปในกลุ่ม pulse
    sudo adduser root pulse-access
    
  • เปิดใช้งานและเริ่มบริการ
    sudo systemctl daemon-reload
    sudo systemctl enable pulseaudio.service
    sudo systemctl start pulseaudio.service
    
2. ตั้งค่าให้รัน pi_webrtc และเริ่มอัตโนมัติเมื่อรีบูต
  • สร้างไฟล์ /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
    
  • เปิดใช้งานและเริ่มบริการ
    sudo systemctl daemon-reload
    sudo systemctl enable pi-webrtc.service
    sudo systemctl start pi-webrtc.service
    

การตั้งค่าขั้นสูง

  • ต้องเพิ่มไมโครโฟนและลำโพงเพื่อรองรับการสื่อสารสองทาง

ไมโครโฟน

  • ดูลิงก์สำหรับคำแนะนำเรื่องการต่อสายและการทดสอบไมโครโฟน

ลำโพง

  • ดูลิงก์สำหรับคำแนะนำเรื่องการตั้งค่าลำโพง

ใบอนุญาต

  • โปรเจ็กต์นี้เผยแพร่ภายใต้ Apache License, Version 2.0 ดูรายละเอียดเพิ่มเติมได้ในไฟล์ LICENSE

สรุปโดย GN⁺

  • โปรเจ็กต์นี้นำเสนอวิธีเปลี่ยน Raspberry Pi ให้เป็นกล้องรักษาความปลอดภัยภายในบ้านแบบหน่วงต่ำ
  • ใช้ตัวเข้ารหัสฮาร์ดแวร์ v4l2DMA และ WebRTC เพื่อทำงานแบบ P2P ล้วนโดยไม่ต้องมีมีเดียเซิร์ฟเวอร์
  • ผู้ใช้หลายคนสามารถรับชมไลฟ์สตรีมพร้อมกันได้ จึงเหมาะสำหรับใช้เป็นกล้องรักษาความปลอดภัยในบ้าน
  • กลไก signaling ที่ใช้ MQTT รองรับได้ทั้งการเข้าถึงภายใน LAN และการเข้าถึงระยะไกล
  • โปรเจ็กต์อื่นที่มีความสามารถคล้ายกัน ได้แก่ MotionEye และ ZoneMinder

1 ความคิดเห็น

 
GN⁺ 2024-09-17
ความคิดเห็นจาก Hacker News
  • ผู้ใช้คนหนึ่งพยายามติดตั้งระบบรักษาความปลอดภัยเพื่อเฝ้าดูจากระยะไกลระหว่างซ่อมบ้าน แต่พบว่าฟังก์ชันส่วนใหญ่ต้องใช้อินเทอร์เน็ตบรอดแบนด์

    • เขาจึงสร้างระบบของตัวเองโดยใช้กล้อง Raspberry Pi, RPi Zero 2W, LTE hotspot และซิมเติมเงินของ T-Mobile ราคา $5/เดือน
    • ในส่วนซอฟต์แวร์ เขาใช้ imgcomp เพื่อถ่ายภาพทุกวินาที แล้วอัปโหลดภาพที่เปลี่ยนแปลงไปยัง VPS เพื่อรับการแจ้งเตือนบนโทรศัพท์ผ่าน Gotify
  • ผู้ใช้อีกรายหนึ่งอาศัยอยู่ในอพาร์ตเมนต์ระหว่างสร้างบ้าน และต้องการทำวิดีโอไทม์แลปส์พร้อมตรวจสอบความคืบหน้างานผ่านอินเทอร์เน็ต

    • เขาพบกล้องคุณภาพดีกว่าบน AliExpress
  • ผู้ใช้อีกรายหนึ่งพิจารณาใช้โปรเจกต์ mediamtx กับ Raspberry Pi Zero WH

    • เป็นตัวอย่างที่ดีของการใช้ WebRTC และอาจต้องตั้งค่า DDNS กับ port forwarding
    • สามารถใช้โซลูชันโอเพนซอร์สเพื่อสร้างการเชื่อมต่อแบบส่วนตัวระหว่าง Pi กับเซิร์ฟเวอร์ได้
  • ผู้ใช้คนหนึ่งตั้งคำถามว่าทำไม Raspberry Pi 5 จึงไม่รองรับ v4l2 hardware encoding

  • ผู้ใช้อีกรายหนึ่งกำลังพยายามทำระบบตรวจจับคนแบบเรียลไทม์โดยใช้โมเดล yolov3-tiny

    • เขากำลังพยายามรีดประสิทธิภาพให้สูงสุดด้วย C++
  • ผู้ใช้อีกรายหนึ่งใช้ Sentry-Picam เพื่อบรรลุเป้าหมายที่คล้ายกัน โดยซิงก์กับอุปกรณ์อีก 3 เครื่องผ่าน Syncthing และเชื่อมสคริปต์ push notification ที่อิงกับ sendxmpp

  • ผู้ใช้คนหนึ่งทำโปรเจกต์ลักษณะคล้ายกันด้วย Nvidia Jetson และตอนนี้กำลังสนใจ reCamera

  • ผู้ใช้อีกรายหนึ่งกำลังมองหาบอร์ดที่ใช้เฟิร์มแวร์โอเพนซอร์ส

  • สุดท้าย ผู้ใช้คนหนึ่งสงสัยว่า WebRTC เป็นโซลูชันที่ดีหรือไม่ หากต้องการบันทึกเฉพาะเสียง