Cámara de seguridad de código abierto basada en Raspberry Pi
(github.com/TzuHuanTai)- Raspberry Pi WebRTC es un proyecto basado en C++20 que convierte una Raspberry Pi o una NVIDIA Jetson en una plataforma de streaming WebRTC con una latencia de alrededor de 200 ms
- Usa WebRTC nativo y admite codificación por hardware/software, instantáneas, grabación, transmisión y control remoto y mensajería IoT mediante WebRTC DataChannel
- El método de señalización admite MQTT, WHEP y WebSocket; MQTT se usa para que la cámara Pi y el cliente intercambien la información de conexión WebRTC
- Los dispositivos compatibles son Raspberry Pi Zero/3/4/5 y NVIDIA Jetson Nano/NX/Orin; la cámara puede usar CSI o USB y debe ser compatible con libcamera, libargus y V4L2
- En Pi 5 o en dispositivos sin codificador por hardware, hay que quitar
--hw-accelde las opciones de ejecución; WHEP no requiere broker, pero sí un hostname público
Resumen del proyecto
- Raspberry Pi WebRTC es un proyecto que convierte una Raspberry Pi o una NVIDIA Jetson en una plataforma de streaming WebRTC de baja latencia
- La latencia objetivo se indica como de aproximadamente 200 ms
- Las tecnologías principales se describen así
-
libwebrtc m146.7680
-
C++20
- Licencia Apache 2.0
-
Funciones compatibles
- Ofrece streaming basado en WebRTC nativo
- La codificación de video admite codificación por hardware y codificación por software
- Las funciones de cámara incluyen instantáneas, grabación y transmisión
- Admite control remoto y mensajería IoT mediante DataChannel de WebRTC
Métodos de señalización y clientes
- Admite señalización por MQTT
- Admite señalización por WHEP
- Admite señalización por WebSocket
- picamera.js: procesamiento de señalización SFU y transmisión
Requisitos
- Las placas compatibles son Raspberry Pi Zero/3/4/5 o NVIDIA Jetson Nano/NX/Orin
- La cámara puede ser una cámara CSI o USB
- La entrada de cámara debe ser compatible con libcamera, libargus o V4L2
Inicio rápido en Raspberry Pi
- Instalar Raspberry Pi OS
- Graba Lite OS en la tarjeta SD con Raspberry Pi Imager
- Instalar dependencias
- Instala
libmosquitto1,pulseaudio,libavformat61,libswscale8,libyaml-cpp0.8
- Instala
- Descargar el binario
- Descarga el último release binary y descomprímelo
- Señalización MQTT
Forma de ejecución y puntos a tener en cuenta
- Abre picamera-web, agrega la configuración de MQTT y luego genera un
UID - En la Pi, ejecuta
./pi-webrtcy especifica como opciones la cámara, FPS, resolución, host MQTT, puerto, nombre de usuario, contraseña, UID, etc. - Las opciones de ejemplo incluyen
--camera=libcamera:0,--fps=30,--width=1280,--height=960,--use-mqtt,--no-audio, entre otras --hw-acceles una opción que se agrega al usar codificación por hardware en Pi Zero 2W, 3B, 4B- En Pi 5 o en dispositivos sin codificador por hardware, se debe quitar
--hw-accel
Uso avanzado
- Transmitir un livestream a más de 1,000 espectadores mediante SFU
- Usar el driver V4L2 heredado: para cámaras USB
- Ejecutar como servicio de Linux
- Grabación
- Comunicación de audio bidireccional
- Mensajería bidireccional por DataChannel
- Transmitir IA o cualquier feed personalizado a una cámara virtual
- Usar WHEP con proxy Nginx
- Usar WebRTC Camera en Home Assistant
1 comentarios
Opiniones en Hacker News
Hace tiempo necesitaba monitorear de forma remota una casa en remodelación, así que intenté instalar un sistema de seguridad muy publicitado que me habían recomendado algunos conocidos, pero no era barato, y recién durante la configuración me di cuenta de que la mayoría de las funciones que quería requerían internet de banda ancha.
En ningún material de marketing aparecía ese requisito, la casa no tenía internet y no pensaba pagar al menos 60 dólares más por internet además de los 40 dólares mensuales del sistema de seguridad.
En su lugar, conecté una cámara Raspberry Pi a una RPi Zero 2W que ya tenía, y compré un hotspot LTE y una SIM prepaga de T-Mobile de 5 dólares al mes.
Para el software usé imgcomp para tomar una foto cada segundo y guardarla en un disco RAM; si dos fotos cambiaban más allá del ruido, hacía que la Pi subiera la foto modificada a un directorio en un VPS, y configuré eso como disparador para que Gotify enviara al teléfono una notificación con el enlace a la foto.
En conjunto era una configuración bastante a lo Rube Goldberg, pero funcionó casi perfectamente durante varios años.
Hace tiempo estaba construyendo algo parecido: https://youtube.com/watch?v=5E7_40PWqiQ
Vivía en un departamento mientras construía mi casa, y quería hacer un video timelapse con una cámara y, de paso, poder conectarme desde internet para ver qué estaban haciendo los trabajadores.
Lamentablemente, cada idea que se me ocurría ya la había hecho alguien; en este caso, en China. En AliExpress hay cámaras bastante buenas que hacen esto y más, y además tienen un acabado mejor que una carcasa improvisada impresa en 3D.
Mi sueño es hacer un dispositivo así y permitir acceso remoto a través de Tor. Así podría mantenerse completamente local y aun así acceder de forma remota desde cualquier parte del mundo.
Un proyecto alternativo que estaba mirando para probar en una Raspberry Pi Zero WH es mediamtx.
https://github.com/bluenviron/mediamtx?tab=readme-ov-file#raspberry-pi-cameras
Es un buen ejemplo de uso de WebRTC y, curiosamente, WebRTC todavía no se usa lo suficiente.
Si lo autoalojás y querés acceder remotamente al servidor de señalización usando datos móviles, puede que tengas que configurar DDNS y redirección de puertos si tu ISP te da una IP dinámica.
Sin embargo, este enfoque expone el servidor a internet. En su lugar, se puede usar una solución open source que cree una conexión privada entre la Pi y el servidor. Así no hace falta abrir acceso de red al servidor, ni tener IP estática o redirección de puertos.
Me pregunto por qué creés que a WebRTC le costó tanto imponerse ampliamente. Siempre busco proyectos nuevos, ya sea por temas de calidad del software, materiales educativos, etc.
No termino de entender que la Raspberry Pi 5 no soporte codificación por hardware v4l2. Si pusieron tanto esfuerzo en el decodificado de video, ¿por qué no hay encoder?
Aunque codificación y decodificación se solapan, cuando trabajé en el códec Opus también había bastante código que solo correspondía a una de las dos rutas.
Es justo lo que estaba buscando. Quería correr detección de personas.
Estoy usando yolov3-tiny; no es lo más nuevo, pero es un modelo de machine learning de visión por computadora muy liviano, y ahora estoy maximizando el rendimiento de inferencia en C++ para detectar personas en tiempo real alrededor de mi casa.
Quiero que, si alguien entra al terreno de noche, se enciendan automáticamente una sirena y luces para ahuyentar al intruso.
https://github.com/jmaczan/yolov3-tiny-openvino
Pensé en un enfoque donde las luces y la sirena se activen gradualmente a medida que la persona se acerca. Así reaccionaría mucho antes y daría suficientes señales a un posible intruso para que se retire.
Creo que sería más eficaz ir subiendo la adrenalina poco a poco dentro del loop de feedback, porque un efecto repentino solo requiere decidir una vez.
Hace poco hice un dispositivo de grabación siempre encendido. El objetivo principal es grabar audio de forma continua, no para vigilancia, sino para músicos y creadores que no quieren tener que acordarse de presionar el botón de grabar en medio de una gran interpretación.
Usé una Zero-W, un script de shell algo delicado que maneja
arecord/aplay, y un frontend en turboLua; funciona bastante bien.Graba continuamente, pero borra solo el audio “viejo” una vez que pasa el período de retención definido por el usuario, con opciones de 1 minuto, 5 minutos, 15 minutos, 30 minutos, 1 hora, 3 horas, 5 horas y 24 horas.
También hice un frontend que permite al usuario hacer Keep de un tramo de tiempo en el que siente que capturó algo bueno. Esta heurística es parecida a los mecanismos de interruptor de hombre muerto/cámara de seguridad de muchos productos de vigilancia.
Funciona tan bien que me pregunto por qué todavía no se volvió algo estándar. Parece que aún existe cierta preferencia económica por no querer llenar el almacenamiento, pero hoy en día 128 GB duran bastante.
Creo que algún día este enfoque se volverá común. Es bastante inspirador dejarlo instalado, olvidarse de él, volver después de varias horas de jam y encontrar solo lo que querés conservar, mientras el resto ya quedó ordenado automáticamente.
No hay que olvidarse del viejo proyecto RPi Cam Web Interface. Es bastante antiguo, pero todavía funciona en mis Pi.
Lo uso en un entorno de operación continua para no destruir la tarjeta SD, y el almacenamiento se envía a un servidor. La interfaz también es limpia.
https://elinux.org/RPi-Cam-Web-Interface
Para un uso parecido, estoy usando muy bien https://github.com/TinkerTurtle/Sentry-Picam.
Sincronicé la carpeta de imágenes/videos grabados con otras 3 máquinas mediante syncthing para tener redundancia, y agregué un script de notificaciones push basado en
sendxmpppara recibir alertas en tiempo real en todos los dispositivos si pasa algo.Bastante genial. Antes trabajé en algo parecido en https://securade.ai usando Nvidia Jetson como dispositivo de edge.
Ahora me entusiasma reCamera: https://www.seeedstudio.com/blog/recamera/