Transmita a tela para vários dispositivos pela rede


Havia a necessidade de exibir painéis com monitoramento em várias telas no escritório. Existem vários antigos Raspberry Pi Modelo B + e um hipervisor com um número quase ilimitado de recursos.


Aparentemente, o Raspberry Pi Modelo B + não tem aleatoriedade suficiente para manter o navegador constantemente em execução e desenhar um grande número de gráficos nele, pelo que acontece que a página está parcialmente com erros e geralmente trava.


Havia uma solução bastante simples e elegante, que eu quero compartilhar com você.


Como você sabe, todos os Raspberry têm um processador de vídeo bastante poderoso, excelente para decodificação de vídeo por hardware. Então surgiu a idéia de lançar um navegador com um painel em outro lugar e transferir o fluxo final com a imagem renderizada para a framboesa.


Além de tudo isso, deveria simplificar o gerenciamento, pois, neste caso, toda a configuração será realizada em uma máquina virtual, mais fácil de atualizar e fazer backup.


Mal disse o que fez.


Lado do servidor


Usaremos o Cloud Image pronto para Ubuntu . Sem exigir instalação, ele contém tudo o que você precisa para implantar rapidamente uma máquina virtual, e o suporte ao Cloud-Init ajuda a configurar instantaneamente sua rede, adicionar chaves ssh e colocá-la rapidamente em operação.


Implementamos uma nova máquina virtual e, em primeiro lugar, instalamos o Xorg , nodm e fluxbox nela:


apt-get update apt-get install -y xserver-xorg nodm fluxbox sed -i 's/^NODM_USER=.*/NODM_USER=ubuntu/' /etc/default/nodm 

Também usamos a configuração do Xorg gentilmente fornecida por Diego Ongaro, adicionando apenas a nova resolução 1920x1080 , já que todos os nossos monitores a usarão:


 cat > /etc/X11/xorg.conf <<\EOT Section "Device" Identifier "device" Driver "vesa" EndSection Section "Screen" Identifier "screen" Device "device" Monitor "monitor" DefaultDepth 16 SubSection "Display" Modes "1920x1080" "1280x1024" "1024x768" "800x600" EndSubSection EndSection Section "Monitor" Identifier "monitor" HorizSync 20.0 - 50.0 VertRefresh 40.0 - 80.0 Option "DPMS" EndSection Section "ServerLayout" Identifier "layout" Screen "screen" EndSection EOT systemctl restart nodm 

Agora instale o Firefox, iniciaremos como um serviço do sistema e, ao mesmo tempo, escreveremos um arquivo de unidade para ele:


 apt-get install -y firefox xdotool cat > /etc/systemd/system/firefox.service <<\EOT [Unit] Description=Firefox After=network.target [Service] Restart=always User=ubuntu Environment="DISPLAY=:0" Environment="XAUTHORITY=/home/ubuntu/.Xauthority" ExecStart=/usr/bin/firefox -url 'http://example.org/mydashboard' ExecStartPost=/usr/bin/xdotool search --sync --onlyvisible --class "Firefox" windowactivate key F11 [Install] WantedBy=graphical.target EOT systemctl enable firefox systemctl start firefox 

Precisamos do Xdotool para executar o Firefox diretamente no modo de tela cheia.
Usando o parâmetro -url , -url pode especificar qualquer página para que ela seja aberta automaticamente quando o navegador iniciar.


Nesse estágio, nosso quiosque está pronto, mas agora precisamos exportar a imagem pela rede para outros monitores e dispositivos. Para fazer isso, usaremos os recursos do Motion JPEG , um formato usado com mais frequência para streaming de vídeo da maioria das câmeras da web.


Para fazer isso, precisamos de duas coisas: FFmpeg com o módulo x11grab , para capturar imagens de X e streamEye , que a distribuirá aos nossos clientes:


 apt-get install -y make gcc ffmpeg cd /tmp/ wget https://github.com/ccrisan/streameye/archive/master.tar.gz tar xvf master.tar.gz cd streameye-master/ make make install cat > /etc/systemd/system/streameye.service <<\EOT [Unit] Description=streamEye After=network.target [Service] Restart=always User=ubuntu Environment="DISPLAY=:0" Environment="XAUTHORITY=/home/ubuntu/.Xauthority" ExecStart=/bin/sh -c 'ffmpeg -f x11grab -s 1920x1080 -r 1 -i :0 -f mjpeg -q:v 5 - 2>/dev/null | streameye' [Install] WantedBy=graphical.target EOT systemctl enable streameye systemctl start streameye 

Como nossa imagem não requer uma atualização rápida, indiquei a taxa de atualização: 1 quadro por segundo (parâmetro -r 1 ) e qualidade da compactação: 5 (parâmetro -q:v 5 )


Agora tentamos ir para http: // your-vm: 8080 / , em resposta, você verá uma captura de tela constantemente atualizada da área de trabalho. Ótimo! - era isso que era necessário.


Parte do cliente


Ainda Ă© mais simples aqui, como eu disse, usaremos o Raspberry Pi Modelo B +.


Primeiro, instale o Arch Linux ARM nele, para isso, seguimos as instruções no site oficial.


Também precisaremos alocar mais memória para o nosso chip de vídeo, para isso editaremos em /boot/config.txt


 gpu_mem=128 

Inicialize nosso novo sistema e lembre-se de inicializar o chaveiro pacman, instale o OMXPlayer :


 pacman -Sy omxplayer 

Notavelmente, o OMXPlayer pode funcionar sem o Xs, é por isso que tudo o que precisamos fazer é gravar um arquivo de unidade e executá-lo:


 cat > /etc/systemd/system/omxplayer.service <<\EOT [Unit] Description=OMXPlayer Wants=network-online.target After=network-online.target [Service] Type=simple Restart=always ExecStart=/usr/bin/omxplayer -r --live -b http://your-vm:8080/ --aspect-mode full [Install] WantedBy=multi-user.target EOT systemctl enable omxplayer systemctl start omxplayer 

Como o parâmetro -b http://your-vm:8080/ passamos a URL do nosso servidor.


Isso é tudo, uma imagem do nosso servidor deve aparecer imediatamente na tela conectada. Em caso de problemas, o fluxo será reiniciado automaticamente e os clientes se reconectarão a ele.


Como bônus, você pode definir a imagem resultante como um protetor de tela para todos os computadores no escritório. Para fazer isso, você precisará do MPV e do XScreenSaver :


 mode: one selected: 0 programs: \ "Monitoring Screen" mpv --really-quiet --no-audio --fs \ --loop=inf --no-stop-screensaver \ --wid=$XSCREENSAVER_WINDOW \ http://your-vm:8080/ \n\ maze -root \n\ electricsheep --root 1 \n\ 

Agora seus colegas ficarĂŁo muito felizes :)

Source: https://habr.com/ru/post/pt450118/


All Articles