Ροή οθόνης σε πολλές συσκευές μέσω του δικτύου

Ροή οθόνης σε πολλές συσκευές μέσω του δικτύου

Είχα την ανάγκη να εμφανίσω ένα ταμπλό με παρακολούθηση σε πολλές οθόνες στο γραφείο. Υπάρχουν πολλά παλιά Raspberry Pi Model B + και ένας hypervisor με σχεδόν απεριόριστο αριθμό πόρων.

Προφανώς το Raspberry Pi Model B+ δεν έχει αρκετή τυχαιότητα για να διατηρεί το πρόγραμμα περιήγησης σε συνεχή λειτουργία και να αποδίδει πολλά γραφικά σε αυτό, εξαιτίας του οποίου συμβαίνει η σελίδα να είναι εν μέρει bugged και συχνά κολλάει.

Υπήρχε μια αρκετά απλή και κομψή λύση, την οποία θέλω να μοιραστώ μαζί σας.

Όπως γνωρίζετε, όλα τα Raspberries διαθέτουν έναν αρκετά ισχυρό επεξεργαστή βίντεο, ο οποίος είναι εξαιρετικός για αποκωδικοποίηση βίντεο υλικού. Έτσι προέκυψε η ιδέα να εκκινήσουμε ένα πρόγραμμα περιήγησης με πίνακα ελέγχου κάπου αλλού και να μεταφέρουμε μια έτοιμη ροή με μια rendered εικόνα στο raspberry.

Επιπλέον, αυτό θα πρέπει να έχει απλοποιημένη διαχείριση, καθώς σε αυτήν την περίπτωση όλες οι ρυθμίσεις παραμέτρων θα εκτελούνται σε μία εικονική μηχανή, η οποία είναι ευκολότερη η ενημέρωση και η δημιουργία αντιγράφων ασφαλείας.

Όχι νωρίτερα.

Μέρος διακομιστή

Χρησιμοποιούμε έτοιμο Cloud Image για το Ubuntu. Δεν απαιτεί εγκατάσταση, περιέχει όλα όσα χρειάζεστε για να αναπτύξετε γρήγορα μια εικονική μηχανή και Υποστήριξη CloudInit βοηθά στην άμεση εγκατάσταση ενός δικτύου, προσθήκη κλειδιών ssh και γρήγορη θέση σε λειτουργία.

Αναπτύσσουμε μια νέα εικονική μηχανή και πρώτα από όλα την εγκαθιστούμε σε αυτήν Xorg, ονομ и κουτί ροής:

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

Θα χρησιμοποιήσουμε επίσης τη διαμόρφωση για το Xorg, ευγενικά χορηγείται us Diego Ongaro, προσθέτοντας μόνο μια νέα ανάλυση 1920 × 1080, αφού όλες οι οθόνες μας θα το χρησιμοποιούν:

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

Τώρα θα εγκαταστήσουμε τον Firefox, θα τον τρέξουμε ως υπηρεσία συστήματος, οπότε για ένα πράγμα θα γράψουμε ένα αρχείο μονάδας για αυτόν:

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

Χρειαζόμαστε το Xdotool για να τρέξουμε το firefox αμέσως σε λειτουργία πλήρους οθόνης.
Χρήση παραμέτρου -url μπορείτε να καθορίσετε οποιαδήποτε σελίδα έτσι ώστε να ανοίγει αυτόματα κατά την εκκίνηση του προγράμματος περιήγησης.

Σε αυτό το στάδιο, το περίπτερο μας είναι έτοιμο, αλλά τώρα πρέπει να εξάγουμε την εικόνα μέσω του δικτύου σε άλλες οθόνες και συσκευές. Για να το κάνουμε αυτό, θα χρησιμοποιήσουμε τις δυνατότητες Motion JPEG, μια μορφή που χρησιμοποιείται πιο συχνά για ροή βίντεο από τις περισσότερες κάμερες web.

Για αυτό χρειαζόμαστε δύο πράγματα: FFmpeg με ενότητα x11 αρπαγή, για λήψη φωτογραφιών από x και streamEye, που θα το διανείμει στους πελάτες μας:

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

Επειδή η εικόνα μας δεν απαιτεί γρήγορη ενημέρωση, καθόρισα τον ρυθμό ανανέωσης: 1 καρέ ανά δευτερόλεπτο (παράμετρος -r 1) και ποιότητα συμπίεσης: 5 (παράμετρος -q:v 5)

Τώρα ας προσπαθήσουμε να πάμε στο http://your-vm:8080/, σε απάντηση θα δείτε ένα στιγμιότυπο οθόνης της επιφάνειας εργασίας που ενημερώνεται συνεχώς. Εξαιρετική! — τι χρειαζόταν.

Τμήμα πελάτη

Είναι ακόμα πιο εύκολο εδώ, όπως είπα, θα χρησιμοποιήσουμε το Raspberry Pi Model B +.

Πρώτα απ 'όλα, ας το εγκαταστήσουμε ArchLinux ARM, γι' αυτό ακολουθούμε οδηγίες στην επίσημη ιστοσελίδα.

Θα χρειαστεί επίσης να διαθέσουμε περισσότερη μνήμη για το τσιπ βίντεο μας, για αυτό θα επεξεργαστούμε /boot/config.txt

gpu_mem=128

Ας εκκινήσουμε το νέο μας σύστημα και μην ξεχάσουμε να αρχικοποιήσουμε το μπρελόκ pacman, εγκαταστήστε OMXPlayer:

pacman -Sy omxplayer

Είναι αξιοσημείωτο ότι το OMXPlayer μπορεί να λειτουργήσει χωρίς x, οπότε το μόνο που χρειαζόμαστε είναι να γράψουμε ένα αρχείο μονάδας για αυτό και να εκτελέσουμε:

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

Ως παράμετρος -b http://your-vm:8080/ περνάμε το url από τον διακομιστή μας.

Αυτό είναι όλο, μια εικόνα από τον διακομιστή μας θα πρέπει να εμφανιστεί αμέσως στη συνδεδεμένη οθόνη. Σε περίπτωση προβλημάτων, η ροή θα επανεκκινηθεί αυτόματα και οι πελάτες θα συνδεθούν ξανά σε αυτήν.

Ως μπόνους, μπορείτε να εγκαταστήσετε την εικόνα που προκύπτει ως προφύλαξη οθόνης σε όλους τους υπολογιστές του γραφείου. Για αυτό θα χρειαστείτε ΟΧΗΜΑ ΠΟΛΛΑΠΛΩΝ ΧΡΗΣΕΩΝ и 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

Τώρα οι συνάδελφοί σας θα είναι πολύ χαρούμενοι 🙂

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο