1 pontos por GN⁺ 2024-09-17 | 1 comentários | Compartilhar no WhatsApp
  • 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-accel das 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

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
  • Instalação de dependências
    • Instale libmosquitto1, pulseaudio, libavformat61, libswscale8, libyaml-cpp0.8
  • Download do binário
  • Sinalização via MQTT
    • É possível usar HiveMQ, EMQX ou um broker auto-hospedado
    • O MQTT permite que a câmera Pi e os clientes troquem informações de conexão WebRTC
    • O WHEP não exige broker, mas requer um nome de host público

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-webrtc e 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-audio etc.
  • --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

1 comentários

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

    • “O sistema de segurança não era barato” e “o sistema custava uns 40 dólares” não parecem combinar muito bem. Fico curioso sobre o quão barato você esperava que fosse
    • Acho que isso combina perfeitamente com o espírito maker e hacker. Você precisava de algo, então montou uma solução com o que tinha, e nem parece tão estilo Rube Goldberg assim
    • Você esperava conseguir monitorar uma câmera pela internet sem ter conexão de internet? Do jeito que foi escrito, parece que você esperava que a câmera já viesse com LTE embutido sem assinatura
    • É uma configuração bem decente. Hoje em dia talvez desse para colocar atrás disso um módulo Coral com GPU ou TPU do codeproject.ai para processar também
  • 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

    • Alguns desses dispositivos, talvez a maioria ou até todos, exigem um serviço externo. Ou seja, só funcionam enquanto esse serviço existir e ficam nas mãos do fornecedor
      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

    • Ver o WebRTC atingir todo o seu potencial é uma paixão de vida. Depois que você conhece P2P/NAT traversal, não dá para voltar atrás
      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
    • Montar um servidor MQTT no Pi resolve o problema :)
  • 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?

    • Imagino que seja porque há muito menos gente codificando do que decodificando
      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
    • Foi uma decisão de usar a área de silício em outra coisa. A CPU do Pi 5 é forte o suficiente para decodificar em software a maioria dos streams H.264, e o Pi 5 tem decodificador por hardware de H.265
  • É 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

    • Consigo imaginar o alarme disparando aleatoriamente no meio da noite
      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/aplay e um frontend em turboLua, e funcionou muito bem
    Ele 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 sendxmpp para receber alertas em tempo real em todos os dispositivos quando acontece alguma coisa

  • Bem 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/