Trasmetti lo schermo a più dispositivi sulla rete

Trasmetti lo schermo a più dispositivi sulla rete

Avevo la necessità di visualizzare una dashboard con monitoraggio su più schermi in ufficio. Esistono diversi vecchi Raspberry Pi Model B + e un hypervisor con una quantità quasi illimitata di risorse.

Apparentemente il Raspberry Pi Model B+ non ha abbastanza casualità per mantenere il browser costantemente in esecuzione e renderizzare molta grafica al suo interno, per cui capita che la pagina sia parzialmente buggata e spesso si blocchi.

C'era una soluzione abbastanza semplice ed elegante, che voglio condividere con voi.

Come sai, tutti i lamponi hanno un processore video abbastanza potente, ottimo per la decodifica video hardware. Quindi è nata l'idea di avviare un browser con una dashboard da qualche altra parte e trasferire un flusso già pronto con un'immagine renderizzata al lampone.

Inoltre, ciò dovrebbe avere una gestione semplificata, poiché in questo caso tutta la configurazione verrà eseguita su una macchina virtuale, che è più facile da aggiornare e fare il backup.

Detto fatto.

Parte server

Usiamo pronto Immagine cloud per Ubuntu. Non richiede installazione, contiene tutto il necessario per distribuire rapidamente una macchina virtuale e Supporto CloudInit aiuta a configurare istantaneamente una rete, aggiungere chiavi ssh e metterla rapidamente in funzione.

Distribuiamo una nuova macchina virtuale e prima di tutto la installiamo su di essa Xorg, annuire и scatola di flusso:

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

Useremo anche la configurazione per Xorg, gentilmente concesso noi Diego Ongaro, aggiungendo solo una nuova risoluzione 1920 × 1080, poiché tutti i nostri monitor lo utilizzeranno:

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

Ora installeremo Firefox, lo eseguiremo come servizio di sistema, quindi per prima cosa scriveremo un file unit per esso:

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

Xdotool è necessario per noi per eseguire immediatamente Firefox in modalità a schermo intero.
Usando il parametro -url puoi specificare qualsiasi pagina in modo che si apra automaticamente all'avvio del browser.

A questo punto il nostro chiosco è pronto, ma ora dobbiamo esportare l'immagine attraverso la rete su altri monitor e dispositivi. Per fare questo, useremo le possibilità Motion JPEG, un formato più comunemente utilizzato per lo streaming di video dalla maggior parte delle webcam.

Per questo abbiamo bisogno di due cose: FFmpeg con modulo x11 afferrare, per catturare immagini da x e streamEye, che lo distribuirà ai nostri clienti:

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

Poiché la nostra immagine non richiede un aggiornamento rapido, ho specificato la frequenza di aggiornamento: 1 fotogramma al secondo (parametro -r 1) e qualità di compressione: 5 (parametro -q:v 5)

Ora proviamo ad andare a http://your-vm:8080/, in risposta vedrai uno screenshot del desktop costantemente aggiornato. Grande! - quello che serviva.

Dalla parte del cliente

È ancora più facile qui, come ho detto, useremo il Raspberry Pi Model B +.

Prima di tutto, installiamolo ARM di ArchLinux, per questo seguiamo istruzione sul sito ufficiale.

Avremo anche bisogno di allocare più memoria per il nostro chip video, per questo lo modificheremo /boot/config.txt

gpu_mem=128

Avviamo il nostro nuovo sistema e non dimenticate di inizializzare il keyring di pacman, install OMXPlayer:

pacman -Sy omxplayer

Sorprendentemente, OMXPlayer può funzionare senza x, quindi tutto ciò di cui abbiamo bisogno è scrivere un file unit per esso ed eseguire:

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

Come parametro -b http://your-vm:8080/ stiamo passando l'URL dal nostro server.

Questo è tutto, un'immagine dal nostro server dovrebbe apparire immediatamente sullo schermo connesso. In caso di problemi, lo stream verrà riavviato automaticamente e i client si riconnetteranno ad esso.

Come bonus, puoi installare l'immagine risultante come salvaschermo su tutti i computer dell'ufficio. Per questo avrai bisogno MPV и XSscreenSaver:

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

Ora i tuoi colleghi saranno molto felici 🙂

Fonte: habr.com

Aggiungi un commento