Képernyő streamelése több eszközre a hálózaton keresztül

Képernyő streamelése több eszközre a hálózaton keresztül

Szükségem volt arra, hogy az irodában több képernyőn megjelenítsek egy felügyeleti műszerfalat. Számos régi Raspberry Pi Model B + és egy hipervizor, szinte korlátlan mennyiségű erőforrással.

Úgy tűnik, a Raspberry Pi Model B+-ban nincs elég véletlenszerűség ahhoz, hogy a böngésző folyamatosan működjön és sok grafikát jelenítsen meg benne, ami miatt előfordul, hogy az oldal részben hibás és gyakran összeomlik.

Volt egy meglehetősen egyszerű és elegáns megoldás, amit szeretnék megosztani veletek.

Mint tudják, az összes Raspberry meglehetősen erős videoprocesszorral rendelkezik, amely nagyszerű a hardveres videó dekódolásához. Így jött az ötlet, hogy indítsunk el egy dashboardos böngészőt valahol máshol, és egy kész streamet, egy renderelt képpel vigyünk át a málnára.

Ezen túlmenően egyszerűsíteni kell a kezelést, mivel ebben az esetben minden konfiguráció egyetlen virtuális gépen történik, amelyet könnyebb frissíteni és biztonsági másolatot készíteni.

Alig van szó, mint kész.

Szerver rész

Készen használjuk Cloud Image az Ubuntu számára. Telepítést nem igényel, mindent tartalmaz, ami egy virtuális gép gyors üzembe helyezéséhez szükséges CloudInit támogatás segít a hálózat azonnali beállításában, ssh-kulcsok hozzáadásában és gyors üzembe helyezésében.

Telepítünk egy új virtuális gépet, és először telepítjük rá Xorg, nodm и fluxus doboz:

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

Szívesen használjuk a Xorg konfigurációját is megadott nekünk Diego Ongaro, csak egy új felbontással 1920 × 1080, mivel minden monitorunk ezt fogja használni:

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

Most telepítjük a Firefoxot, rendszerszolgáltatásként fogjuk futtatni, így egyrészt egységfájlt írunk neki:

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

Szükségünk van az Xdotool-ra, hogy a Firefox azonnal teljes képernyős módban futhasson.
A paraméter használatával -url bármilyen oldalt megadhat, hogy az automatikusan megnyíljon a böngésző indításakor.

Ebben a szakaszban a kioszkunk készen áll, de most a képet a hálózaton keresztül exportálnunk kell más monitorokra és eszközökre. Ennek érdekében ki fogjuk használni a lehetőségeket Motion JPEG, ez a formátum, amelyet gyakrabban használnak videók streamelésére a legtöbb webkameráról.

Ehhez két dologra van szükségünk: FFmpeg modullal x11 grab, képek rögzítéséhez x-ről és streamEye, amely elküldi ügyfeleinknek:

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

Mivel képünk nem igényel gyors frissítést, a frissítési gyakoriságot megadtam: 1 képkocka másodpercenként (paraméter -r 1) és tömörítési minőség: 5 (paraméter -q:v 5)

Most próbáljunk meg odamenni http://your-vm:8080/, válaszul egy folyamatosan frissülő képernyőképet fog látni az asztalról. Nagy! - ami kellett.

Ügyfél oldal

Itt még mindig egyszerűbb, ahogy mondtam, a Raspberry Pi Model B+-t fogjuk használni.

Először is telepítsük ArchLinux ARM, ezt követjük utasítás a hivatalos weboldalon.

A videochipünkhöz is több memóriát kell lefoglalnunk, ehhez szerkesztjük /boot/config.txt

gpu_mem=128

Indítsuk el az új rendszerünket, és ne felejtsük el inicializálni a pacman kulcstartót, telepíteni OMXPlayer:

pacman -Sy omxplayer

Figyelemre méltó, hogy az OMXPlayer X nélkül is tud működni, így csak egy egységfájlt kell írnunk hozzá, és futtassuk:

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

Paraméterként -b http://your-vm:8080/ átadjuk az url-t a szerverünkről.

Ez minden, a szerverünkről származó képnek azonnal meg kell jelennie a csatlakoztatott képernyőn. Bármilyen probléma esetén a stream automatikusan újraindul, és az ügyfelek újra csatlakoznak hozzá.

Bónuszként a kapott képet képernyővédőként telepítheti az iroda összes számítógépére. Ehhez szüksége lesz 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

Most a kollégái nagyon boldogok lesznek 🙂

Forrás: will.com

Hozzászólás