Fluu la ekranon al pluraj aparatoj tra la reto

Fluu la ekranon al pluraj aparatoj tra la reto

Mi bezonis montri panelon kun monitorado sur pluraj ekranoj en la oficejo. Ni havas plurajn malnovajn Raspberry Pi Model B+ kaj hiperviziilon kun preskaŭ senlima kvanto da rimedoj.

Ŝajne la Raspberry Pi Model B+ ne havas sufiĉe da hazardo por teni la retumilon konstante funkcianta kaj prezenti grandan kvanton da grafikaĵoj en ĝi, tial okazas, ke la paĝo estas parte misa kaj ofte kraŝas.

Mi trovis sufiĉe simplan kaj elegantan solvon, kiun mi volas dividi kun vi.

Kiel vi scias, ĉiuj Framboj havas sufiĉe potencan videoprocesilon, kiu estas bonega por aparatara videomalkodado. Do venis la ideo lanĉi retumilon kun panelo aliloke, kaj transdoni pretan fluon kun bildita bildo al la frambo.

Krome, ĉi tio devus esti simpligita administrado, ĉar ĉi-kaze la tuta aranĝo estus farita sur unu virtuala maŝino, kiu estus pli facile ĝisdatigebla kaj rezerva.

Ne pli frue dirite ol farite.

Servila parto

Ni uzos la pretan Nuba Bildo por Ubuntu. Sen postuli instaladon, ĝi enhavas ĉion, kion vi bezonas por rapide disfaldi virtualan maŝinon, kaj Cloud-Init-subteno helpas tuj starigi reton, aldoni ssh-ŝlosilojn kaj rapide funkciigi ĝin.

Ni deplojas novan virtualan maŝinon kaj unue instalas ĝin sur ĝi Xorg, nom и fluokesto:

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

Ni ankaŭ uzos la agordon por Xorg, afable koncedita us Diego Ongaro, aldonante nur novan rezolucion 1920 × 1080, ĉar ĉiuj niaj monitoroj uzos ĝin:

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

Nun ni instalos Firefox, ni funkcios ĝin kiel sistema servo, do ni skribu unuopan dosieron por ĝi unufoje:

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

Ni bezonas Xdotool por lanĉi Firefox tuj en plenekrana reĝimo.
Uzante la parametron -url Vi povas specifi ajnan paĝon por ke ĝi malfermu aŭtomate kiam la retumilo komenciĝas.

En ĉi tiu etapo, nia kiosko estas preta, sed nun ni devas eksporti la bildon tra la reto al aliaj ekranoj kaj aparatoj. Por fari tion ni profitos la ŝancojn Moviĝo JPEG, formato kiu estas pli ofte uzata por streaming video de la plej multaj retkameraoj.

Por fari tion ni bezonas du aferojn: FFmpeg kun modulo x11kapti, por kapti bildojn de X kaj streamEye, kiu disdonos ĝin al niaj klientoj:

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

Ĉar nia bildo ne postulas rapidan ĝisdatigon, mi specifis la refreŝigan indicon: 1 kadro por sekundo (parametro -r 1) kaj kunprema kvalito: 5 (parametro -q:v 5)

Nun ni provu iri al http://your-vm:8080/, en respondo vi vidos konstante ĝisdatigitan ekrankopion de via labortablo. Bonege! — tion oni bezonis.

Klienta parto

Ĉi tie ĉio estas eĉ pli simpla, kiel mi jam diris, ni uzos Raspberry Pi Model B+.

Antaŭ ĉio, ni instalu sur ĝi ArchLinux ARM, por tio ni sekvas instrukcioj en la oficiala retejo.

Ni ankaŭ devos asigni pli da memoro por nia videoblato, por tio ni redaktos /boot/config.txt

gpu_mem=128

Ni lanĉu nian novan sistemon kaj, memorante pravalorigi la pacman-ŝlosilringon, instalu OMXPlayer:

pacman -Sy omxplayer

Kio estas rimarkinda estas, ke OMXPlayer povas funkcii sen X-oj, do ĉio, kion ni bezonas, estas skribi unu-dosieron por ĝi kaj ruli:

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

Kiel parametro -b http://your-vm:8080/ ni pasas la URL de nia servilo.

Jen ĉio, bildo de nia servilo tuj aperu sur la konektita ekrano. Se aperas iuj problemoj, la rivereto aŭtomate rekomenciĝos kaj klientoj rekonektos al ĝi.

Kiel gratifiko, vi povas instali la rezultan bildon kiel ekranŝirmilon sur ĉiuj komputiloj en la oficejo. Por ĉi tio vi bezonos 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

Nun viaj kolegoj estos tre feliĉaj :)

fonto: www.habr.com

Aldoni komenton