Livecam 🌊 📷
Como eu criei uma câmera capaz de transmitir vídeo ao vivo com 0 setup de instalação
A ideia
Uma das piores sensações que existem é sair de casa de madrugada na expectativa de surfar um mar clássico e se deparar com um mar liso. Surfistas que não moram perto da praia dependem da previsão do tempo e dados meteorológicos para saber se sua viagem até a praia valerá a pena. Infelizmente, as previsões são falhas ou muitas vezes o surfista não sabe quais condições geram as melhores ondas em cada praia.
Tendo me frustrado várias vezes com mares lisos em dias que supostamente clássicos, eu decidi construir uma câmera barata, resiliente e de baixa manutenção - todas características que facilitariam a instalação e manutenção do sistema - para que eu pudesse monitorar as condições do mar da minha casa. 1
A ideia é simples: um microcontrolador equipado de uma câmera e Wi-Fi seria colocado em estabelecimentos nos principais pontos de surf da minha cidade e, através da web, seria possível acessar uma transmissão ao vivo das imagens.
A partir dessa ideia, comecei a traçar a implementação.
O hardware
Uma das coisas que eu tinha certeza sobre o projeto é que eu queria que ele fosse barato2 - idealmente mais barato do que as opções existentes no mercado de câmeras de segurança. Isso me dava um orçamento de mais ou menos R$100,00 para o projeto inteiro.
Tendo isso em mente, comecei a procurar microcontroladores que encaixassem no meu pequeno orçamento e acabei achando o ESP32 da Espressif Systems, um microncontrolador super barato e com uma versão sua que já acompanha uma câmera chamada ESP32-CAM.
Para acompanhar o mini-computador, comprei também uma antena para aumentar o seu alcance de conectividade a uma rede Wi-Fi - assim facilitando sua instalação nos estabelecimentos.
Por fim, fiz uma impressão 3D de uma case para o conjunto câmera-antena porém devido ao material da resina utilizada nessa impressão parecer um pouco frágil demais, eu fiz uma case utilizando painéis de acrílico que eu reaproveitei de alguns porta-retratos da minha casa.
Assim, o esquema na minha mente se tornou: o ESP, na praia, captura as imagens e as envia através da internet para um servidor central, capaz de retransmitir essas imagens para vários clientes que acessam as imagens através do navegador.
O software
O ESP utiliza o protocolo RTSP para transmitir suas imagens. Esse protocolo foi escolhido por ser mais simples que protocolos alternativos como RTMP e existir muito código open source capaz de ser reaproveitado para meus propósitos, diminuindo assim meu tempo de implementação.
De maneira geral, toda a aplicação funciona na seguinte ordem:
- O ESP faz uma requisição HTTP para uma página na internet para descobrir o IP do servidor para o qual ele deverá transmitir suas imagens
- O ESP estabelece uma sessão TCP com o servidor
- O servidor, após estabelecida a sessão TCP com o ESP, age como cliente e faz o setup do protocolo RTSP para que o ESP comece a mandar as imagens
- Após o setup, o ESP começa a enviar as imagens para o servidor
- O servidor espera a conexão de um cliente para retransmitir as imagens do ESP
Esse projeto exigiu pouquíssimo código escrito do 0 da minha parte. O ESP reaproveita grande parte do seu código da biblioteca Micro-RTSP (escrita em C++), com algumas alterações feitas por mim para que o primeiro passo descrito seja executado.
É necessário configurar o ESP apenas com o SSID e a senha da Wi-Fi, e o resto acontece automaticamente. O primeiro passo é necessário para que não se precise configurar o roteador de nenhum estabelecimento no qual a câmera vá ser instalada para aceitar conexões vindas de fora da rede local. Assim, o processo de instalação da câmera se torna o mais fácil e independente do local possível.
No servidor, eu reaproveitei um projeto chamado simple-rtsp-server (escrito em Golang) capaz de fazer a retransmissão de uma fonte RTSP (que nesse caso é o ESP) de maneira que suporta meu caso. Porém, assim como no código que roda no ESP, eu precisei fazer algumas alterações no código para poder cumprir um dos passos. Nesse caso, o servidor não sabia estabelecer uma conexão com uma fonte RTSP esperando que a sessão TCP fosse iniciada pela fonte ao invés de ser iniciada pelo servidor.
Como eu nunca tinha escrito nada em Golang, eu tive que aprender a linguagem do 0 para conseguir navegar na codebase do projeto e implementar minha feature. Não foi muito difícil pois Go é altamente inspirado em C, uma linguagem na qual eu já sou altamente familiarizado.
Feito isso, foi só questão de escrever o HTML e CSS a ser mandado para os clientes e colocar na página um com o url da retransmissão feita pelo servidor.
Resultado
Link para o repositório com todo o código
Ao longo processo de fazer a câmera (alguns meses nos quais eu trabalhei no projeto e fazia pausas intermitentes devido às demandas do meu colégio) eu gravei várias demonstrações dela funcionando. Infelizmente (ou felizmente, por outro lado) uma empresa acabou instalando câmeras de melhor qualidade na minha cidade e meu projeto se tornou obsoleto - apesar de ainda provavelmente ser mais barato, eficiente e de menor custo de manutenção que a competição.
Algumas fotos e vídeos ao longo do processo de desenvolvimento da câmera:
Pensamentos finais
Se eu quisesse por alguma razão revisitar esse projeto e viabilizá-lo como um produto, eu primeiramente escolheria um microcontrolador de maior capacidade de processamento e melhor experiência no ciclo de desenvolvimento. O ESP é lento, o que traduz em uma baixa taxa de frames por segundo, deixando o vídeo transmitido quebradiço. Além disso, eu precisava colocá-lo numa breadboard e apertar o botão de reset com uma pinça toda vez que eu ia fazer o upload de código novo.
Além disso, depender de pontos comerciais para instalar as câmeras não é uma boa ideia a longo prazo pois é difícil gerenciar as relações com tantas pessoas. Idealmente, as câmeras deveriam ser colocadas em postes e terem conectividade 4G (ou 5G) que permitisse o envio de vídeo ao vivo sem quedas de sinal abruptas.
Rodapé
-
Diversos serviços já oferecem esse tipo de funcionalidade - tanto no Brasil como nos principais pontos de surf no mundo. Na época em que comecei esse projeto (março de 2022), esse tipo de serviço era indisponível na minha região. Foi só depois que eu finalizei meu primeiro protótipo que uma empresa especializada na operação de câmeras para monitorar condições de surf surgiu. ↩︎
-
Pelo fato que eu ainda estava no ensino médio e sem nenhuma fonte de renda própria. Agora estou no ensino superior e sem nenhuma fonte de renda própria! ↩︎