Streamujte obrazovku do viacerých zariadení cez sieť

Streamujte obrazovku do viacerých zariadení cez sieť

Mal som potrebu zobraziť dashboard s monitorovaním na viacerých obrazovkách v kancelárii. Existuje niekoľko starých Raspberry Pi Model B + a hypervízor s takmer neobmedzeným množstvom zdrojov.

Raspberry Pi Model B+ zrejme nemá dostatočnú náhodnosť, aby prehliadač neustále bežal a vykresľoval v ňom veľa grafiky, kvôli čomu sa stáva, že stránka je čiastočne zabugovaná a často padá.

Existovalo pomerne jednoduché a elegantné riešenie, o ktoré sa chcem s vami podeliť.

Ako viete, všetky Maliny majú pomerne výkonný video procesor, ktorý je skvelý na hardvérové ​​dekódovanie videa. Tak prišiel nápad spustiť prehliadač s dashboardom niekde inde a preniesť hotový stream s vyrenderovaným obrázkom na malinovku.

Navyše by to malo mať zjednodušenú správu, pretože v tomto prípade bude všetka konfigurácia vykonaná na jednom virtuálnom počítači, ktorý sa jednoduchšie aktualizuje a zálohuje.

Len čo sa povie, tak urobí.

Serverová časť

Používame hotové Cloudový obrázok pre Ubuntu. Nevyžaduje žiadnu inštaláciu, obsahuje všetko, čo potrebujete na rýchle nasadenie virtuálneho počítača, a Podpora CloudInit pomáha okamžite nastaviť sieť, pridať ssh kľúče a rýchlo ju uviesť do prevádzky.

Nasadíme nový virtuálny stroj a v prvom rade ho naň nainštalujeme xorg, nodm и tavivový box:

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

Použijeme tiež konfiguráciu pre Xorg, láskavo udelené nás Diego Ongaro, pridávajúc iba nové uznesenie 1920 × 1080, pretože ho budú používať všetky naše monitory:

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

Teraz nainštalujeme Firefox, spustíme ho ako systémovú službu, takže na jednu vec preň napíšeme súbor jednotky:

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

Na okamžité spustenie firefoxu v režime celej obrazovky potrebujeme Xdotool.
Pomocou parametra -url môžete zadať ľubovoľnú stránku, aby sa automaticky otvorila pri spustení prehliadača.

V tejto fáze je náš kiosk pripravený, ale teraz potrebujeme exportovať obraz cez sieť na iné monitory a zariadenia. K tomu využijeme možnosti Pohyblivý JPEG, formát, ktorý sa častejšie používa na streamovanie videa z väčšiny webových kamier.

Na to potrebujeme dve veci: FFmpeg s modulom x11grab, na zachytenie obrázkov z X a streamEye, ktorá ho bude distribuovať našim klientom:

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

Keďže náš obrázok nevyžaduje rýchlu aktualizáciu, určil som obnovovaciu frekvenciu: 1 snímka za sekundu (parameter -r 1) a kvalita kompresie: 5 (parameter -q:v 5)

Teraz skúsme prejsť na http://your-vm:8080/, ako odpoveď uvidíte neustále aktualizovanú snímku obrazovky pracovnej plochy. Skvelé! — čo bolo treba.

Strana klienta

Tu je to stále jednoduchšie, ako som povedal, použijeme Raspberry Pi Model B +.

Najprv si ho nainštalujte ArchLinux ARM, za tým sa riadime inštrukcie na oficiálnej stránke.

Budeme tiež musieť prideliť viac pamäte pre náš video čip, na ktorý budeme upravovať /boot/config.txt

gpu_mem=128

Nabootujeme náš nový systém a nezabudnime inicializovať pacman kľúčenku, nainštalovať OMXPlayer:

pacman -Sy omxplayer

Je pozoruhodné, že OMXPlayer môže fungovať bez X, takže všetko, čo potrebujeme, je napísať súbor jednotky a spustiť:

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

Ako parameter -b http://your-vm:8080/ odovzdávame adresu URL z nášho servera.

To je všetko, na pripojenej obrazovke by sa mal okamžite objaviť obrázok z nášho servera. V prípade akýchkoľvek problémov sa stream automaticky reštartuje a klienti sa k nemu znova pripoja.

Ako bonus si môžete výsledný obrázok nainštalovať ako šetrič obrazovky na všetky počítače v kancelárii. Na to budete potrebovať 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

Teraz budú mať vaši kolegovia veľkú radosť 🙂

Zdroj: hab.com

Pridať komentár