Transmite a pantalla a varios dispositivos a través da rede

Transmite a pantalla a varios dispositivos a través da rede

Tiven a necesidade de mostrar un panel de control con monitorización en varias pantallas da oficina. Hai varios antigos Raspberry Pi Model B + e un hipervisor cunha cantidade case ilimitada de recursos.

Ao parecer, o Raspberry Pi Model B+ non ten suficiente aleatoriedade para manter o navegador funcionando constantemente e mostrando moitos gráficos nel, polo que ocorre que a páxina está parcialmente con erros e adoita fallar.

Houbo unha solución bastante sinxela e elegante, que quero compartir contigo.

Como sabes, todos os Raspberries teñen un procesador de vídeo bastante potente, que é excelente para a decodificación de vídeo de hardware. Entón, xurdiu a idea de lanzar un navegador cun panel noutro lugar e enviar un fluxo preparado cunha imaxe renderizada á framboesa.

Ademais, esta debería ter unha xestión simplificada, xa que neste caso toda a configuración realizarase nunha máquina virtual, que é máis fácil de actualizar e facer copias de seguridade.

Nada máis dicir que feito.

Parte do servidor

Usamos listo Imaxe da nube para Ubuntu. Non require instalación, contén todo o que precisa para implantar rapidamente unha máquina virtual e Soporte de CloudInit axuda a configurar unha rede ao instante, engadir claves ssh e poñela en funcionamento rapidamente.

Implementamos unha nova máquina virtual e, en primeiro lugar, instalamos nela Xorg, aceno и 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

Tamén usaremos a configuración de Xorg, por favor concedido nós Diego Ongaro, engadindo só unha nova resolución 1920 × 1080, xa que todos os nosos monitores o empregarán:

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 instalaremos Firefox, executarémolo como servizo do sistema, polo que, por unha banda, escribiremos un ficheiro unitario para el:

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

Necesitamos Xdotool para executar Firefox inmediatamente en modo de pantalla completa.
Usando o parámetro -url pode especificar calquera páxina para que se abra automaticamente cando se inicie o navegador.

Nesta fase, o noso quiosco está listo, pero agora necesitamos exportar a imaxe pola rede a outros monitores e dispositivos. Para iso, utilizaremos as posibilidades Movemento JPEG, un formato máis usado para transmitir vídeo desde a maioría das cámaras web.

Para iso necesitamos dúas cousas: FFmpeg con módulo x11 coller, para capturar imaxes de X e streamEye, que o distribuirá aos nosos 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

Dado que a nosa imaxe non require unha actualización rápida, especifiquei a frecuencia de actualización: 1 fotograma por segundo (parámetro -r 1) e calidade de compresión: 5 (parámetro -q:v 5)

Agora imos tentar ir http://your-vm:8080/, en resposta verá unha captura de pantalla constantemente actualizada do escritorio. Genial! - o que facía falta.

Lado do cliente

Aínda é máis fácil aquí, como dixen, usaremos o Raspberry Pi Model B +.

Primeiro de todo, imos instalalo ArchLinux ARM, para iso seguimos instrucións no sitio oficial.

Tamén teremos que asignar máis memoria para o noso chip de vídeo, para iso editarémolo /boot/config.txt

gpu_mem=128

Arranquemos o noso novo sistema e non esquezas inicializar o anel de chaves pacman, instalalo OMXPlayer:

pacman -Sy omxplayer

Sorprendentemente, OMXPlayer pode funcionar sen X, polo que todo o que necesitamos é escribir un ficheiro de unidade para el 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 pasando o URL do noso servidor.

Iso é todo, unha imaxe do noso servidor debería aparecer inmediatamente na pantalla conectada. Se hai algún problema, o fluxo reiniciarase automaticamente e os clientes volverán conectarse a el.

Como extra, podes instalar a imaxe resultante como protector de pantalla en todos os ordenadores da oficina. Para iso necesitarás 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 os teus compañeiros estarán moi contentos 🙂

Fonte: www.habr.com

Engadir un comentario