Prijenos zaslona na više uređaja putem mreže

Prijenos zaslona na više uređaja putem mreže

Imao sam potrebu prikazati nadzornu ploču s nadzorom na nekoliko ekrana u uredu. Postoji nekoliko starih Raspberry Pi Model B+ i hipervizor s gotovo neograničenom količinom resursa.

Navodno Raspberry Pi Model B+ nema dovoljno slučajnosti da bi preglednik stalno radio i renderirao puno grafike u njemu, zbog čega se događa da stranica djelomično bugi i često se ruši.

Postojalo je prilično jednostavno i elegantno rješenje koje želim podijeliti s vama.

Kao što znate, sve Maline imaju prilično snažan video procesor, koji je izvrstan za hardversko dekodiranje videa. Pa je došla ideja pokrenuti preglednik s nadzornom pločom negdje drugdje, i prebaciti gotov stream s renderiranom slikom na malinu.

Osim toga, ovo bi trebalo imati pojednostavljeno upravljanje, budući da će se u ovom slučaju sva konfiguracija izvoditi na jednom virtualnom računalu, koje je lakše ažurirati i sigurnosno kopirati.

Tek što je rečeno nego učinjeno.

Serverski dio

Koristimo spremno Slika oblaka za Ubuntu. Ne zahtijeva instalaciju, sadrži sve što vam je potrebno za brzu implementaciju virtualnog stroja i CloudInit podrška pomaže u trenutnom postavljanju mreže, dodavanju ssh ključeva i brzom puštanju u rad.

Postavljamo novi virtualni stroj i prije svega ga instaliramo na njega Xorg, ne m и flux box:

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

Također ćemo koristiti konfiguraciju za Xorg, ljubazno odobreno nas Diego Ongaro, dodajući samo novu rezoluciju 1920 × 1080, jer će ga koristiti svi naši monitori:

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

Sada ćemo instalirati Firefox, pokrenut ćemo ga kao sistemsku uslugu, tako da ćemo kao prvo napisati jediničnu datoteku za njega:

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

Trebamo Xdotool kako bismo odmah pokrenuli firefox na cijelom zaslonu.
Korištenje parametra -url možete odrediti bilo koju stranicu tako da se automatski otvara kada se preglednik pokrene.

U ovoj fazi naš kiosk je spreman, ali sada trebamo izvesti sliku preko mreže na druge monitore i uređaje. Da bismo to učinili, iskoristit ćemo mogućnosti Motion JPEG, format koji se češće koristi za strujanje videa s većine web kamera.

Za ovo su nam potrebne dvije stvari: FFmpeg s modulom x11zgrabiti, za snimanje slika sa x i streamEye, koji će ga distribuirati našim klijentima:

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

Budući da naša slika ne zahtijeva brzo ažuriranje, odredio sam brzinu osvježavanja: 1 okvir u sekundi (parametar -r 1) i kvaliteta kompresije: 5 (parametar -q:v 5)

Sada pokušajmo otići na http://your-vm:8080/, kao odgovor vidjet ćete stalno ažuriranu snimku zaslona radne površine. Sjajno! — što je bilo potrebno.

Strana klijenta

Ovdje je još lakše, kao što sam rekao, koristit ćemo Raspberry Pi Model B+.

Prije svega, instalirajmo ga ArchLinux ARM, za ovo pratimo instrukcije na službenoj web stranici.

Također ćemo morati dodijeliti više memorije za naš video čip, za ovo ćemo uređivati /boot/config.txt

gpu_mem=128

Pokrenimo naš novi sustav i ne zaboravimo inicijalizirati pacman keyring, instaliraj OMXPlayer:

pacman -Sy omxplayer

Nevjerojatno, OMXPlayer može raditi bez x-a, tako da sve što trebamo je napisati jediničnu datoteku za njega i pokrenuti:

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

Kao parametar -b http://your-vm:8080/ prosljeđujemo url s našeg poslužitelja.

To je sve, slika s našeg poslužitelja trebala bi se odmah pojaviti na povezanom ekranu. U slučaju bilo kakvih problema, stream će se automatski ponovno pokrenuti i klijenti će se ponovno spojiti na njega.

Kao bonus, možete instalirati rezultirajuću sliku kao čuvar zaslona na svim računalima u uredu. Za ovo će vam trebati 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

Sada će vaši kolege biti jako sretni 🙂

Izvor: www.habr.com

Dodajte komentar