Câmera de segurança open source baseada em Raspberry Pi
(github.com/TzuHuanTai)- Raspberry Pi WebRTC é um projeto baseado em C++20 que transforma um Raspberry Pi ou NVIDIA Jetson em uma plataforma de streaming WebRTC com cerca de 200 ms de latência
- Usa WebRTC nativo e oferece suporte a codificação por hardware/software, snapshots, gravação, transmissão, controle remoto via WebRTC DataChannel e mensagens IoT
- Os métodos de sinalização compatíveis são MQTT, WHEP e WebSocket; o MQTT é usado para que a câmera Pi e os clientes troquem informações de conexão WebRTC
- Os dispositivos suportados são Raspberry Pi Zero/3/4/5 e NVIDIA Jetson Nano/NX/Orin; a câmera pode ser CSI ou USB e deve oferecer suporte a libcamera, libargus ou V4L2
- No Pi 5 ou em dispositivos sem codificador por hardware, é necessário remover
--hw-acceldas opções de execução; o WHEP não exige broker, mas requer um nome de host público
Visão geral do projeto
- Raspberry Pi WebRTC é um projeto que transforma um Raspberry Pi ou NVIDIA Jetson em uma plataforma de streaming WebRTC de baixa latência
- A latência-alvo apresentada é de cerca de 200 ms
- As principais tecnologias indicadas são as seguintes
-
libwebrtc m146.7680
-
C++20
- Licença Apache 2.0
-
Recursos suportados
- Oferece streaming baseado em WebRTC nativo
- A codificação de vídeo oferece suporte a codificação por hardware e codificação por software
- Os recursos de câmera incluem snapshots, gravação e transmissão
- Oferece suporte a controle remoto e mensagens IoT via DataChannel do WebRTC
Métodos de sinalização e clientes
- Oferece suporte à sinalização via MQTT
- Oferece suporte à sinalização via WHEP
- Oferece suporte à sinalização via WebSocket
- picamera.js: sinalização por SFU e transmissão
Requisitos
- As placas suportadas são Raspberry Pi Zero/3/4/5 ou NVIDIA Jetson Nano/NX/Orin
- A câmera pode ser uma câmera CSI ou USB
- A entrada da câmera deve oferecer suporte a libcamera, libargus ou V4L2
Início rápido no Raspberry Pi
- Instalação do Raspberry Pi OS
- Grave o Lite OS em um cartão SD com o Raspberry Pi Imager
- Instalação de dependências
- Instale
libmosquitto1,pulseaudio,libavformat61,libswscale8,libyaml-cpp0.8
- Instale
- Download do binário
- Baixe o release binary mais recente e extraia o arquivo
- Sinalização via MQTT
Forma de execução e observações
- Abra o picamera-web, adicione as configurações de MQTT e gere um
UID - No Pi, execute
./pi-webrtce especifique opções como câmera, FPS, resolução, host MQTT, porta, nome de usuário, senha e UID - Exemplos de opções incluem
--camera=libcamera:0,--fps=30,--width=1280,--height=960,--use-mqtt,--no-audioetc. --hw-accelé uma opção a ser adicionada ao usar codificação por hardware no Pi Zero 2W, 3B, 4B- No Pi 5 ou em dispositivos sem codificador por hardware, é necessário remover
--hw-accel
Uso avançado
- Transmitir uma live stream para mais de 1.000 espectadores via SFU
- Usar o driver V4L2: para câmeras USB
- Executar como serviço Linux
- Gravação
- Comunicação de áudio bidirecional
- Mensagens bidirecionais via DataChannel
- Transmitir IA ou qualquer feed personalizado para uma câmera virtual
- Usar WHEP com proxy Nginx
- Usar WebRTC Camera no Home Assistant
1 comentários
Comentários do Hacker News
Há um tempo, eu precisava monitorar remotamente uma casa em reforma, então tentei instalar um sistema de segurança bem anunciado que amigos recomendaram, mas não era barato e só durante a configuração descobri que a maioria dos recursos que eu queria exigia internet banda larga
Esse requisito não aparecia em nenhum material de marketing, a casa não tinha internet, e eu não estava disposto a pagar 40 dólares por mês pelo sistema de segurança mais pelo menos 60 dólares de internet
Em vez disso, conectei uma câmera Raspberry Pi a um RPi Zero 2W que eu já tinha, comprei um hotspot LTE e um SIM pré-pago da T-Mobile de 5 dólares por mês
No software, usei imgcomp para tirar uma foto por segundo e salvar em um RAM disk; quando duas fotos diferiam além do ruído, o Pi enviava a foto alterada para um diretório no VPS, e isso acionava o Gotify para mandar uma notificação com link da imagem para o celular
No geral, era uma engenhoca estilo Rube Goldberg, mas funcionou quase perfeitamente por vários anos
Um tempo atrás eu estava fazendo algo parecido https://youtube.com/watch?v=5E7_40PWqiQ
Eu morava em um apartamento enquanto a casa estava sendo construída, e queria fazer um vídeo em timelapse com a câmera e, de quebra, permitir acesso pela internet para ver como os trabalhadores estavam indo
Infelizmente, cada ideia que eu tinha já havia sido feita por alguém, neste caso do lado chinês. No AliExpress existem câmeras bem decentes que fazem isso e mais, e o acabamento delas também é melhor do que um case tosco impresso em 3D
Meu sonho é fazer um desses dispositivos e permitir acesso remoto via Tor. Assim ele pode ficar totalmente local e ainda ser acessado remotamente de qualquer lugar do mundo
Um projeto alternativo que eu estava considerando para usar com um Raspberry Pi Zero WH é o mediamtx
https://github.com/bluenviron/mediamtx?tab=readme-ov-file#raspberry-pi-cameras
É um bom uso de WebRTC e, estranhamente, WebRTC ainda é pouco aproveitado
Para fazer self-hosting e acessar remotamente um servidor de sinalização pelo celular, talvez seja preciso configurar DDNS e encaminhamento de portas se o ISP fornecer IP dinâmico
Só que isso expõe o servidor à internet. Em vez disso, dá para usar uma solução open source que crie uma conexão privada entre o Pi e o servidor. Aí não é preciso abrir acesso de rede ao servidor, nem ter IP estático ou port forwarding
Fico curioso por que você acha que o WebRTC teve dificuldade para se popularizar. É problema de qualidade do software, material educacional? Estou sempre procurando projetos novos
Não entendi muito bem a parte de o Raspberry Pi 5 não suportar codificação por hardware v4l2. Colocaram tanto esforço em decodificação de vídeo, então por que não há codificador?
Há partes em comum entre codificação e decodificação, mas quando trabalhei com o codec Opus também havia bastante código que só se aplicava a um dos lados
É exatamente o que eu estava procurando. Eu queria rodar detecção de pessoas
Estou usando yolov3-tiny; não é o mais recente, mas é um modelo de machine learning de visão computacional bem leve, e agora estou maximizando o desempenho de inferência em C++ para fazer detecção de pessoas em tempo real ao redor da casa
Quero que, se alguém entrar na propriedade à noite, a sirene e as luzes liguem automaticamente para espantar o invasor
https://github.com/jmaczan/yolov3-tiny-openvino
Eu imaginei uma abordagem em que as luzes e a sirene sejam ligadas gradualmente conforme a pessoa se aproxima. Assim dá para reagir bem mais cedo e ainda dar sinais suficientes para um possível invasor recuar
Parece mais eficaz aumentar a adrenalina aos poucos dentro do loop de feedback, porque um efeito súbito exige decisão imediata e única
Recentemente fiz um dispositivo de gravação que fica sempre ligado. O objetivo principal é gravar áudio continuamente, não para vigilância, mas para músicos e criadores que não querem ter de lembrar de apertar o botão de gravar no meio de uma grande performance
Usei um Zero-W, um script de shell um pouco chato para lidar com
arecord/aplaye um frontend em turboLua, e funcionou muito bemEle grava o tempo todo, mas apaga apenas o áudio “antigo” depois do período de retenção definido pelo usuário; as opções são 1 minuto, 5 minutos, 15 minutos, 30 minutos, 1 hora, 3 horas, 5 horas e até 24 horas
Também fiz um frontend em que o usuário pode marcar como Keep um intervalo de tempo em que sentiu que capturou algo bom. Essa heurística é parecida com o mecanismo de deadman switch/câmera de segurança de muitos produtos de vigilância
Funciona tão bem que dá até curiosidade de por que isso ainda não virou padrão. Parece que ainda existe uma preferência econômica por não encher o armazenamento, mas hoje em dia até 128 GB duram bastante
Acho que algum dia esse modelo vai se popularizar. Instalar isso, esquecer que existe, tocar por horas e depois só voltar para salvar o que vale a pena, com o resto já limpo automaticamente, é algo bem inspirador
Também não dá para esquecer o antigo projeto RPi Cam Web Interface. Já é bem velho, mas ainda roda nos meus Pis
Eu o executo em um ambiente de operação contínua para não corromper o cartão SD, e o armazenamento vai para um servidor. A interface também é limpa
https://elinux.org/RPi-Cam-Web-Interface
Estou usando https://github.com/TinkerTurtle/Sentry-Picam muito bem para um caso parecido
Sincronizei a pasta de imagens/vídeos gravados com outras 3 máquinas usando syncthing para ter redundância, e acrescentei um script de push notification com
sendxmpppara receber alertas em tempo real em todos os dispositivos quando acontece alguma coisaBem legal. Há um tempo trabalhei em algo parecido na https://securade.ai, usando um Nvidia Jetson como dispositivo de edge
Agora estou animado com a reCamera: https://www.seeedstudio.com/blog/recamera/