Transmita la pantalla a múltiples dispositivos a través de la red

Transmita la pantalla a múltiples dispositivos a través de la red

Tenía la necesidad de mostrar un tablero con monitoreo en varias pantallas en la oficina. Hay varias Raspberry Pi Model B+ antiguas y un hipervisor con una cantidad de recursos casi ilimitada.

Aparentemente, el Raspberry Pi Model B+ no tiene suficiente aleatoriedad para mantener el navegador funcionando constantemente y mostrando una gran cantidad de gráficos en él, por lo que sucede que la página tiene errores parciales y, a menudo, se bloquea.

Hubo una solución bastante simple y elegante, que quiero compartir con ustedes.

Como saben, todas las Raspberry tienen un procesador de video bastante potente, lo cual es excelente para la decodificación de video por hardware. Así que surgió la idea de lanzar un navegador con un tablero en otro lugar y transferir una transmisión ya preparada con una imagen renderizada a la frambuesa.

Además, esto debería haber simplificado la administración, ya que en este caso toda la configuración se realizará en una máquina virtual, que es más fácil de actualizar y respaldar.

Dicho y hecho.

parte del servidor

usamos listo Imagen de la nube para Ubuntu. No requiere instalación, contiene todo lo que necesita para implementar rápidamente una máquina virtual y Soporte de CloudInit ayuda a configurar instantáneamente una red, agregar claves ssh y ponerla en funcionamiento rápidamente.

Implementamos una nueva máquina virtual y, en primer lugar, la instalamos en ella. Xorg, asentir и caja de flujo:

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

También usaremos la configuración para Xorg, amablemente otorgada nosotros Diego Ongaro, agregando solo una nueva resolución 1920 × 1080, ya que todos nuestros monitores lo utilizará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

Ahora instalaremos Firefox, lo ejecutaremos como un servicio del sistema, por lo que, en primer lugar, escribiremos un archivo de unidad para él:

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 ejecutar firefox inmediatamente en modo de pantalla completa.
Usando el parámetro -url puede especificar cualquier página para que se abra automáticamente cuando se inicia el navegador.

En esta etapa, nuestro quiosco está listo, pero ahora necesitamos exportar la imagen a través de la red a otros monitores y dispositivos. Para ello, utilizaremos las posibilidades Motion JPEG, un formato más comúnmente utilizado para la transmisión de video desde la mayoría de las cámaras web.

Para esto necesitamos dos cosas: FFmpeg con módulo x11 agarrar, para capturar imágenes de x y ojo de la corriente, que lo distribuirá a nuestros 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 nuestra imagen no requiere una actualización rápida, especifiqué la frecuencia de actualización: 1 cuadro por segundo (parámetro -r 1) y calidad de compresión: 5 (parámetro -q:v 5)

Ahora intentemos ir a http://your-vm:8080/, en respuesta, verá una captura de pantalla constantemente actualizada del escritorio. ¡Excelente! — lo que se necesitaba.

Lado del cliente

Todavía es más fácil aquí, como dije, usaremos el Raspberry Pi Model B +.

En primer lugar, vamos a instalarlo. ARM de Arch Linux, para esto seguimos instrucciones en el sitio oficial

También necesitaremos asignar más memoria para nuestro chip de video, para esto editaremos en /boot/config.txt

gpu_mem=128

Iniciemos nuestro nuevo sistema y no olvidemos inicializar el llavero de pacman, instalar Jugador OMX:

pacman -Sy omxplayer

Sorprendentemente, OMXPlayer puede funcionar sin x, por lo que todo lo que necesitamos es escribir un archivo de unidad para él y ejecutar:

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 la url desde nuestro servidor.

Eso es todo, una imagen de nuestro servidor debería aparecer inmediatamente en la pantalla conectada. En caso de problemas, la transmisión se reiniciará automáticamente y los clientes se volverán a conectar.

Como beneficio adicional, puede instalar la imagen resultante como protector de pantalla en todas las computadoras de la oficina. Para esto necesitarás MPV и SalvapantallasX:

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

Ahora tus compañeros estarán muy contentos 🙂

Fuente: habr.com

Añadir un comentario