Stream ekran na više uređaja preko mreže

Stream ekran na više uređaja preko mreže

Imao sam potrebu da prikažem kontrolnu tablu sa nadzorom na nekoliko ekrana u kancelariji. Postoji nekoliko starih Raspberry Pi Model B+ i hipervizor sa gotovo neograničenom količinom resursa.

Očigledno Raspberry Pi Model B+ nema dovoljno nasumice da bi pretraživač stalno radio i u njemu renderovao mnogo grafike, zbog čega se dešava da stranica djelimično greši i često pada.

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

Kao što znate, sve Raspberries imaju prilično moćan video procesor, koji je odličan za hardversko dekodiranje videa. Tako se pojavila ideja da pokrenemo pretraživač sa kontrolnom pločom negde drugde, a gotov stream sa renderovanom slikom prenesemo na malinu.

Osim toga, ovo bi trebalo da pojednostavi upravljanje, jer će se u ovom slučaju sva konfiguracija obavljati na jednoj virtuelnoj mašini, koju je lakše ažurirati i napraviti rezervnu kopiju.

Ne pre rečeno nego učinjeno.

Serverski dio

Koristimo spremno Slika u oblaku za Ubuntu. Ne zahtijeva instalaciju, sadrži sve što vam je potrebno za brzo postavljanje virtuelne mašine i CloudInit podrška pomaže u trenutnom postavljanju mreže, dodavanju ssh ključeva i brzom puštanju u rad.

Postavljamo novu virtuelnu mašinu i pre svega je instaliramo na nju Xorg, nom и 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, pošto ć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 sistemski servis, tako da ćemo prvo napisati jedinični fajl 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

Potreban nam je Xdotool da bismo mogli odmah pokrenuti firefox u režimu celog ekrana.
Korištenje parametra -url možete odrediti bilo koju stranicu tako da se automatski otvara kada se pretraživač pokrene.

U ovoj fazi naš kiosk je spreman, ali sada moramo eksportirati sliku preko mreže na druge monitore i uređaje. Za to ćemo iskoristiti mogućnosti Motion JPEG, format koji se češće koristi za streaming videa s većine web kamera.

Za ovo su nam potrebne dvije stvari: FFmpeg sa modulom x11grab, 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, naveo sam brzinu osvježavanja: 1 kadar u sekundi (parametar -r 1) i kvalitet kompresije: 5 (parametar -q:v 5)

Pokušajmo sada prijeći na http://your-vm:8080/, kao odgovor vidjet ćete stalno ažurirani snimak ekrana radne površine. Odlično! — šta je trebalo.

Na strani klijenta

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

Prije svega, hajde da ga instaliramo ArchLinux ARM, za ovo pratimo uputstva na službenoj web stranici.

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

gpu_mem=128

Pokrenimo naš novi sistem i ne zaboravite da inicijalizirate pacman privjesak za ključeve, instalirajte OMXPlayer:

pacman -Sy omxplayer

Zanimljivo je da OMXPlayer može raditi bez x, tako da sve što trebamo je da napišemo jediničnu datoteku za njega i pokrenemo:

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 sa našeg servera.

To je sve, slika sa našeg servera bi se odmah trebala pojaviti na povezanom ekranu. U slučaju bilo kakvih problema, stream će se automatski ponovo pokrenuti i klijenti će se ponovo povezati na njega.

Kao bonus, dobijenu sliku možete instalirati kao screensaver na svim računarima u kancelariji. 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še kolege biti veoma srećne 🙂

izvor: www.habr.com

Dodajte komentar