Transmita a tela para vários dispositivos pela rede

Transmita a tela para vários dispositivos pela rede

Precisava exibir um dashboard com monitoramento em diversas telas do escritório. Temos vários Raspberry Pi Modelo B+ antigos e um hipervisor com uma quantidade quase ilimitada de recursos.

Aparentemente, o Raspberry Pi Modelo B+ não possui aleatoriedade suficiente para manter o navegador em constante execução e renderizar uma grande quantidade de gráficos nele, por isso acontece que a página apresenta falhas parcialmente e trava com frequência.

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

Como você sabe, todos os Raspberries possuem um processador de vídeo bastante poderoso, excelente para decodificação de vídeo por hardware. Então surgiu a ideia de lançar um navegador com painel em outro lugar e transferir um stream pronto com uma imagem renderizada para o framboesa.

Além disso, isso deveria ter simplificado o gerenciamento, já que neste caso toda a configuração seria realizada em uma máquina virtual, o que seria mais fácil de atualizar e fazer backup.

Não antes de dizer que acabou.

parte do servidor

Usaremos o pronto Imagem de nuvem para Ubuntu. Sem exigir instalação, ele contém tudo que você precisa para implantar rapidamente uma máquina virtual e Suporte para inicialização em nuvem ajuda a configurar instantaneamente uma rede, adicionar chaves ssh e colocá-la em operação rapidamente.

Implantamos uma nova máquina virtual e primeiro a instalamos nela Xorg, nodm и caixa de fluxo:

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

Também usaremos a configuração do Xorg, por gentileza garantido nós Diego Ongaro, acrescentando apenas uma nova resolução 1920 × 1080, já que todos os nossos monitores irão utilizá-lo:

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 vamos instalar o Firefox, vamos executá-lo como um serviço do sistema, então vamos escrever um arquivo de unidade para ele de uma só vez:

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 iniciar o Firefox imediatamente em modo de tela cheia.
Usando o parâmetro -url Você pode especificar qualquer página para que ela abra automaticamente quando o navegador for iniciado.

Nesta fase nosso quiosque está pronto, mas agora precisamos exportar a imagem pela rede para outros monitores e dispositivos. Para isso aproveitaremos as oportunidades Motion JPEG, um formato usado com mais frequência para streaming de vídeo da maioria das câmeras web.

Para fazer isso precisamos de duas coisas: FFmpeg com módulo x11grab, para capturar imagens de X e streamEye, que irá distribuí-lo 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 -i :0 -r 1 -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 atualização rápida, especifiquei a taxa de atualização: 1 quadro por segundo (parâmetro -r 1) e qualidade de compressão: 5 (parâmetro -q:v 5)

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

Lado do cliente

Aqui tudo é ainda mais simples, como já falei, usaremos Raspberry Pi Modelo B+.

Primeiro de tudo, vamos instalar nele ArchLinux ARM, para isso seguimos instruções no site oficial.

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

gpu_mem=128

Vamos inicializar nosso novo sistema e, lembrando de inicializar o chaveiro do pacman, instalar OMXPlayer:

pacman -Sy omxplayer

O que é digno de nota é que o OMXPlayer pode funcionar sem X’s, então tudo que precisamos é escrever um arquivo unitário para ele e executar:

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 parâmetro -b http://your-vm:8080/ estamos passando a URL do nosso servidor.

Só isso, uma imagem do nosso servidor deve aparecer imediatamente na tela conectada. Se surgir algum problema, o stream será reiniciado automaticamente e os clientes se reconectarão a ele.

Como bônus, você pode instalar a imagem resultante como protetor de tela em todos os computadores do escritório. Para isso você vai precisar MPV и 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 :)

Fonte: habr.com

Adicionar um comentário