Criando um monitor de Cameras IP com Raspberry PI


Possuo um sistema de câmeras IP acessível pelo computador e celular, mas seria útil ter um monitor sempre à mostra. O problema é que, diferente das cameras analógicas, não posso simplesmente plugar um monitor em uma rede de câmeras IP. Para exibir as câmeras é necessário um dispositivo inteligente que se conecte à rede e consiga exibir o vídeo.

Cheguei a considerar um tablet para essa função, mas possuía alguns monitores antigos encostados e minha intenção era fixar um deles na parede em frente ao meu carro. Cheguei à conclusão de que um Raspberry PI é uma forma fácil e relativamente barata de resolver o problema.

O que é preciso?

O primeiro passo foi instalar e configurar um Raspberry PI na rede, eu ensino a fazer isso em outro artigo. (você pode seguir so começo até a parte da instalação do Octoprint, que não será necessário para esse projeto).

Qualquer modelo de Raspberry PI é capaz de reproduzir as imagens das câmeras, mas dependendo da resolução da câmera o desempenho do Raspberry Pi pode ser prejudicado nos modelos mais básicos, além disso, como streaming de video utiliza bastante recursos de rede é necessário ter um bom sinal de wifi ou utilizar uma rede cabeada.

Minha recomendação é o modelo Zero W, que é mais simples, para uma ou duas comeras e o 3 B+ para mais câmeras, pois ambos já possuem WiFi, e instalar WiFi em modelos antigos depende de compatibilidade e drivers, o que normalmente toma mais tempo que o projeto todo.

Obtendo a URL de Vídeo

A primeira coisa que você vai precisar é descobrir o endereço de streaming de vídeo das suas câmeras.

Você pode obter essa informação nas próprias câmeras ou, preferencialmente, no dispositivo de gravação de vídeo pela rede (NVR – Network Video Recorder). O endereço obtido pelo NVR é a melhor escolha pois o processamento do NVR normalmente é muito superior ao das câmeras, dessa forma as câmeras não seriam sobrecarregadas por diversos monitores.

No meu caso, como utilizo um NAS Synology o endereço é fornecido pelo software Surveillance Station:

Share Stream Path

É importante observar que se o serviço oferecer mais de uma resolução de streaming é preferível escolher a mais próxima da resolução que será exibida, não a melhor pois o downscaling (redução de resolução) é uma tarefa pesada para o Raspberry Pi.

Ex.: Se você for utilizar 4 cameras em um monitor 1024×768 cada camera ocupará 1/4 da tela, logo a resolução preferida para o streaming é a mais próxima de 512×384.

O endereço tipicamente utiliza um protocolo rtsp, logo começa com rtsp://. Uma vez que você tenha esse endereço você pode testa-lo utilizando o player de vídeo VLC. Escolha a opção Media / Open Network Stream:

VLC Open Network Stream
VLC Enter URL
VLC reproduzindo Câmera IP

Logica de posição das cameras

Essa etapa exige algumas contas simples e algumas informações à respeito do hardware.

Primeiramente é importante decidir como será feita a disposição das imagens:

Disposição de cameras nos monitores

É possível criar diversas configurações de acordo com a resolução e prioridade que se deseja dar para cada câmera, basta entender como as câmeras serão exibidas e construir uma lista de coordenadas para cada “janela”.

A ideia é entender, de acordo com o layout e resolução, onde começa e acaba a imagem de cada câmera.

Em um monitor o início da tela (origem) é o canto superior direito, utilizando uma lógica inversa ao plano cartesiano que nos acostumamos a ver na escola, a posição de um pixel é dada pela distância desse ponto em relação a borda esquerda e superior, or seja, o eixo Y está ao contrário em relação às aulas de matemática:

Coordenadas das cameras

Para definir uma “janela” dentro da tela precisamos da posição inicial e final, dadas respectivamente pelo canto superior esquerdo e inferior direito, dessa forma a “janela” é representada por 4 números.

No exemplo dessa imagem, onde temos um monitor 1024×768 (fora de escala) e 4 câmeras, as janelas 1, 2, 3 e 4 seriam representadas respectivamente por:

0 0 512 384
512 0 1024 384
0 384 512 768
512 384 1024 768

Tome nota desses números, precisaremos deles durante a configuração.

Caso a intenção seja ter mais câmeras do que cabem na tela, isso é possível fazendo a rotação das câmeras, ou seja, definindo mais janelas fora da área da tela e habilitando a opção de que a cada 5 segundos elas troquem de posição em ordem:

Sequência de rotação das cameras

Preparando o Raspberry Pi

Quando comecei a procurar uma solução para streaming de vídeo no Raspberry Pi achei diversas versões do mesmo código, com o nome genérico de “displaycameras”. A origem parece ser esse repositório disponibilizado pelo usuário Anonymousdog. No momento que escrevo isso existem 25 repositório derivados desse. Então é possível que se você precisar de alguma funcionalidade diferente ela já esteja implementada em algum desses.

Primeiramente atualize a lista de pacotes para evitar que algum arquivo seja instalado com versão incorreta ou falhe na instalação:

sudo apt-get update

Agora, vamos baixar o código do displaycameras, vá até a página de releases e copie o link da última versão. Nesse exemplo baixei os arquivos no formato tar.gz:

Local do link

Utilize o wget para baixar o arquivo do link que você copiou:

wget https://github.com/Anonymousdog/displaycameras/archive/0.8.3.3.tar.gz

Agora, para instalar vamos descompactar o arquivo; entrar na pasta (atenção para a versão baixada no nome do arquivo); habilitar a execução do script de instalação e executa-lo:

tar -xvzf 0.8.3.3.tar.gz
cd displaycameras-0.8.3.3
chmod +x install.sh
sudo ./install.sh

Isso deve baixar diversos pacotes e instala-los, deve levar alguns minutos e vai solicitar interação em dois momentos. Ele vai perguntar se você deseja configurar a memória dedicada à GPU, você pode simplesmente apertar enter para o padrão:

Enter a custom gpu split

Em seguida, ao concluir, ele vai perguntar se você deseja ler o arquivo README.md.

você pode digitar “n” para ignoraro README.md:

See Readme.md

Configurando

Foi criada a pasta /etc/displaycameras com os arquivos de configuração do seu layout, vamos entrar nessa pasta:

cd /etc/displaycameras/

em seguida, nessa pasta edite o arquivo layout.conf.default

sudo nano layout.conf.default

Linhas que começam com # estão comentadas, portanto, são ignoradas pelo software.

Primeiro precisamos declarar as janelas que serão utilizadas dando um nome para elas, mesmo as que ficarão fora da tela. Localize esse trecho do arquivo:

Nomes de janelas originais

E edite-o conforme sua necessidade:

Nomes de janelas configurados

Agora vamos inserir as posições que calculamos e anotamos anteriormente, localize esse trecho:

Posições de janelas originais

E troque pela sua configuração:

Posições de janela configuradas

Por fim, precisamos configurar o nome das câmeras, localize esse trecho de código:

Nome das cameras

E coloque os nomes que achar conveniente:

Nomes das cameras configuradas

Caso deseje utilizar a rotação de câmeras, com o fim de exibir mais câmeras do que cabem na tela, descomente a linha abaixo:

Habilitar rotação

Salve e saia com Ctrl+O, Enter, Ctrl+X

Reinicie o serviço e as cameras devem aparecer na tela (no monitor fisicamente plugado ao Raspeberry Pi):

sudo systemctl restart displaycameras.service

Monitor VGA no Raspberry Pi

Para utilizar um monitor VGA você precisará de um adaptador HDMI para VGA. Tive dificuldades com esses adaptadores em modelos mais antigos do Raspberry Pi, e mesmo no Modelo 3B+. Dependendo do monitor e cabo tive problemas de tela piscando ou sinal não detectado:

Tela Piscando Gif

Isso acontece porque o sinal do Raspberry Pi é um pouco fraco e perde ainda mais intensidade passando pelo adaptador. As vezes o problema pode ser uma fonte fraca mas comumente é preciso aumentar o sinal na configuração de boot. Corrigi esse problema descomentando a linha abaixo do arquivo /boo/config.txt

config_hdmi_boost=4

Se necessário você pode tentar aumentar esse valor até 11.

MultiCast

Existe uma melhoria adicional que é possivel fazer dependendo do resto do hardware da rede. Da mesma forma que utilizamos o streaming diretamente do NVR para reduzir o processamento das câmeras, se estivermos utilizando mais de um monitor é possível reduzir o processamento do NVR terceirizando parte dele para o roteador ou switch que realiza um cache dos pacotes, aliviando a necessidade de múltiplas conexões com o NVR. é importante observar que isso normalmente só funciona se a rede for cabeada, se você está conectando o Raspberry Pi por wifi não vai funcionar.

Desse modo, é necessário que tanto o NVR quando o switch suportem esse recurso. No meu caso o Synology DS718+ e o TP-Link tl-sg2210p suportam o recurso.

A configuração é complexa e depende do equipamento exato que você usa. Por isso, não vou entrar em detalhes, mas a ideia é que de modo geral isso diminua consideravelmente o uso de banda.

Na imagem abaixo está ilustrado, na setas em cinza, 2 envios de dados que deixam de existir. Considerando que um streaming de 480p usa aproximadamente 1,5Mbps isso economizaria 12Mb de banda do NAS no cenário de 3 monitores. Você pode calcular seu cenário nessa calculadora online.

Multicast

O Resto da Rede

Além do multicast existem alguns truques que utilizei para garantir a qualidade do streaming na rede. Tudo colabora se você montar a rede com essa finalidade em mente, garantindo que haverá banda suficiente para os streamings de vídeo, a estrutura que montei foi mais ou menos essa:

network topology

Diversos dispositivos da minha rede, incluindo as câmeras, são PoE (Power over Ethernet) ou seja, são alimentados pelo próprio cabo de rede. Por isso, optei por utilizar um switch com esse recurso, dispensando assim adaptadores de tomada e injetores nos cabos.

Minha escolha, pelo custo benefício no momento da instalação, foi o TP-Link tl-sg2210p que além de possuir 8 portas Gigabit PoE, ainda possui duas portas SFP capazes de 10Gbps. Desse modo, é possível aumentar a capacidade da rede se necessário, ligando mais um switch, sem perder uma porta PoE.

Meus access points da Ubiqui funcionaram perfeitamente com ele e nunca apresentaram qualquer instabilidade.

Além disso ele possui recursos gerenciáveis muito úteis, como Link Aggregation, que permite juntar dois ou mais cabos multiplicando a banda de uma conexão, no caso, meu NAS Synology DS718+ possui duas portas de rede e também permite o Link Aggregation, assim consigo ter uma conexão de 2Gbps do NAS para o Switch, que está conectado ao outro switch por uma conxão de 10Gbps, fornecendo banda mais que suficiente para o funcionamento adequado.

Com banda suficiente e energia pelos switches eu queria garantir que tudo continuasse funcionando em uma falha de energia. O NAS que uso tem a opção de se conectar a um nobreak/UPS e desligar em segurança caso a bateria esteja acabando.

Foi difícil encontrar um nobreak compatível e acessível em solo nacional, os antigos nobreaks da APC eram compatíveis com os NAS da Synology, mas os novos não possuem mais a porta de comunicação, e muitos dos que achei no mercado com portas USB usam algum protocolo proprietário que não é reconhecido nativamente ou não possui um driver/software para linux.

Minha solução foi comprar um antigo APC Es600 e comprar separadamente um cabo nada convencional que ele utiliza, com USB 2 em uma ponta e RJ50 em outra. Até pensei em fazer um, até perceber que o conector é RJ50 e não RJ45 como em redes, o alicate certo para o RK50 custa mais que o cabo então acabei encomendando.

, , , ,

Uma resposta para “Criando um monitor de Cameras IP com Raspberry PI”