Transmite ecranul pe mai multe dispozitive prin rețea

Transmite ecranul pe mai multe dispozitive prin rețea

Am avut nevoie să afișez un tablou de bord cu monitorizare pe mai multe ecrane din birou. Există mai multe vechi Raspberry Pi Model B + și un hypervisor cu o cantitate aproape nelimitată de resurse.

Aparent, Raspberry Pi Model B+ nu are suficientă aleatorie pentru a menține browserul să ruleze constant și să redeze o mulțime de grafică în el, din cauza căruia se întâmplă ca pagina să fie parțial cu erori și să se blocheze adesea.

A existat o soluție destul de simplă și elegantă, pe care vreau să o împărtășesc cu voi.

După cum știți, toate Raspberries au un procesor video destul de puternic, care este excelent pentru decodarea video hardware. Așa că a venit ideea de a lansa un browser cu un tablou de bord în altă parte și de a transfera un flux gata făcut cu o imagine redată pe zmeură.

În plus, acest lucru ar trebui să aibă un management simplificat, deoarece în acest caz toată configurația va fi efectuată pe o singură mașină virtuală, care este mai ușor de actualizat și de backup.

Făcut repede și foarte bine.

Partea serverului

Folosim gata Imagine în cloud pentru Ubuntu. Nefiind nevoie de instalare, conține tot ce aveți nevoie pentru a implementa rapid o mașină virtuală și Suport CloudInit vă ajută să configurați instantaneu o rețea, să adăugați chei ssh și să o puneți rapid în funcțiune.

Implementăm o nouă mașină virtuală și, în primul rând, o instalăm pe ea Xorg, nodm и cutie de flux:

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

Vom folosi și configurația pentru Xorg, vă rog acordat noi Diego Ongaro, adăugând doar o nouă rezoluție 1920 × 1080, deoarece toate monitoarele noastre îl vor folosi:

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

Acum vom instala Firefox, îl vom rula ca serviciu de sistem, așa că pentru un lucru vom scrie un fișier unitar pentru 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

Avem nevoie de Xdotool pentru a rula imediat Firefox în modul ecran complet.
Folosind parametrul -url puteți specifica orice pagină, astfel încât să se deschidă automat la pornirea browserului.

În această etapă, chioșcul nostru este gata, dar acum trebuie să exportăm imaginea prin rețea către alte monitoare și dispozitive. Pentru a face acest lucru, vom folosi posibilitățile Mișcare JPEG, un format folosit mai frecvent pentru streaming video de la majoritatea camerelor web.

Pentru asta avem nevoie de două lucruri: fFmpeg cu modul x11grab, pentru captarea imaginilor din x și streamEye, care îl va distribui clienților noștri:

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

Deoarece fotografia noastră nu necesită o actualizare rapidă, am specificat rata de reîmprospătare: 1 cadru pe secundă (parametru -r 1) și calitatea compresiei: 5 (parametru -q:v 5)

Acum să încercăm să mergem la http://your-vm:8080/, ca răspuns, veți vedea o captură de ecran actualizată constant a desktopului. Grozav! — ce era nevoie.

Partea clientului

Este încă mai ușor aici, așa cum am spus, vom folosi Raspberry Pi Model B +.

În primul rând, să-l instalăm ArchLinux ARM, pentru asta urmam instrucțiuni pe site-ul oficial.

De asemenea, va trebui să alocăm mai multă memorie pentru cipul nostru video, pentru asta vom edita /boot/config.txt

gpu_mem=128

Haideți să pornim noul nostru sistem și să nu uitați să inițializați breloul pacman, să instalați OMXPlayer:

pacman -Sy omxplayer

În mod remarcabil, OMXPlayer poate funcționa fără X, așa că tot ce avem nevoie este să scriem un fișier unitar pentru el și să rulăm:

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

Ca parametru -b http://your-vm:8080/ transmitem adresa URL de pe serverul nostru.

Asta e tot, o poză de pe serverul nostru ar trebui să apară imediat pe ecranul conectat. În cazul oricăror probleme, fluxul va fi repornit automat și clienții se vor reconecta la el.

Ca bonus, puteți instala imaginea rezultată ca screensaver pe toate computerele de la birou. Pentru asta vei avea nevoie 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

Acum colegii tăi vor fi foarte fericiți 🙂

Sursa: www.habr.com

Adauga un comentariu