Streamujte obrazovku na více zařízení po síti

Streamujte obrazovku na více zařízení po síti

Měl jsem potřebu zobrazit dashboard s monitorováním na několika obrazovkách v kanceláři. Existuje několik starých Raspberry Pi Model B + a hypervizor s téměř neomezeným množstvím zdrojů.

Raspberry Pi Model B+ zřejmě nemá dostatečnou náhodnost, aby prohlížeč neustále běžel a vykresloval v něm spoustu grafiky, kvůli čemuž se stává, že stránka je částečně zabugovaná a často padá.

Existovalo poměrně jednoduché a elegantní řešení, o které se s vámi chci podělit.

Jak víte, všechny Maliny mají poměrně výkonný videoprocesor, který je skvělý pro hardwarové dekódování videa. Takže přišel nápad spustit prohlížeč s dashboardem někde jinde a přenést hotový stream s vyrenderovaným obrázkem na malinu.

Navíc by to mělo mít zjednodušenou správu, protože v tomto případě bude veškerá konfigurace provedena na jednom virtuálním počítači, který se snadněji aktualizuje a zálohuje.

Sotva řečeno, než uděláno.

Část serveru

Používáme ready Cloudový obrázek pro Ubuntu. Nevyžaduje žádnou instalaci, obsahuje vše, co potřebujete k rychlému nasazení virtuálního stroje, a Podpora CloudInit pomáhá okamžitě nastavit síť, přidat ssh klíče a rychle ji uvést do provozu.

Nasadíme nový virtuální stroj a nejprve ho na něj nainstalujeme Xorg, nodm и tavidlo:

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

Použijeme také konfiguraci pro Xorg, laskavě uděleno nás Diego Ongaro, přidává pouze nové usnesení 1920 × 1080, protože jej budou používat všechny 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

Nyní nainstalujeme Firefox, spustíme jej jako systémovou službu, takže za prvé pro něj napíšeme soubor 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

K okamžitému spuštění firefoxu v režimu celé obrazovky potřebujeme Xdotool.
Pomocí parametru -url můžete zadat libovolnou stránku, aby se automaticky otevřela při spuštění prohlížeče.

V této fázi je náš kiosk připraven, ale nyní potřebujeme exportovat obraz přes síť na jiné monitory a zařízení. K tomu využijeme možnosti Motion JPEG, formát běžně používaný pro streamování videa z většiny webových kamer.

K tomu potřebujeme dvě věci: FFmpeg s modulem x11 chytit, pro zachycení obrázků z x a streamEye, která jej bude distribuovat našim klientům:

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

Protože náš obrázek nevyžaduje rychlou aktualizaci, zadal jsem obnovovací frekvenci: 1 snímek za sekundu (parametr -r 1) a kvalita komprese: 5 (parametr -q:v 5)

Nyní zkusme jít do http://your-vm:8080/, jako odpověď uvidíte neustále aktualizovaný snímek plochy. Skvělý! - co bylo potřeba.

Klientská část

Tady je to stále jednodušší, jak jsem řekl, použijeme Raspberry Pi Model B+.

Nejprve jej nainstalujme ArchLinux ARM, za tím se řídíme instrukce na oficiálních stránkách.

Budeme také muset alokovat více paměti pro náš video čip, za tímto účelem budeme upravovat /boot/config.txt

gpu_mem=128

Spusťte náš nový systém a nezapomeňte inicializovat klíčenku pacman, nainstalovat OMXPlayer:

pacman -Sy omxplayer

Je pozoruhodné, že OMXPlayer může fungovat bez x, takže vše, co potřebujeme, je napsat pro něj soubor jednotky a spustit:

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

Jako parametr -b http://your-vm:8080/ předáváme adresu URL z našeho serveru.

To je vše, obrázek z našeho serveru by se měl okamžitě objevit na připojené obrazovce. V případě jakýchkoli problémů se stream automaticky restartuje a klienti se k němu znovu připojí.

Jako bonus si můžete výsledný obrázek nainstalovat jako spořič obrazovky na všechny počítače v kanceláři. K tomu budete potřebovat 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

Nyní budou mít vaši kolegové velkou radost 🙂

Zdroj: www.habr.com

Přidat komentář