دفق الشاشة إلى أجهزة متعددة عبر الشبكة

دفق الشاشة إلى أجهزة متعددة عبر الشبكة

كنت بحاجة لعرض لوحة القيادة مع المراقبة على عدة شاشات في المكتب. هناك العديد من طراز Raspberry Pi Model B + القديم ومشرف به قدر غير محدود تقريبًا من الموارد.

من الواضح أن Raspberry Pi Model B + لا يحتوي على ما يكفي من العشوائية للحفاظ على تشغيل المتصفح باستمرار وتقديم الكثير من الرسومات فيه ، مما يحدث أن الصفحة بها أخطاء جزئية وغالبًا ما تتعطل.

كان هناك حل بسيط وأنيق إلى حد ما ، أريد مشاركته معك.

كما تعلم ، تحتوي جميع Raspberries على معالج فيديو قوي إلى حد ما ، وهو أمر رائع لفك تشفير فيديو الأجهزة. لذلك جاءت فكرة إطلاق متصفح بلوحة معلومات في مكان آخر ، ونقل دفق جاهز مع صورة معروضة إلى التوت.

بالإضافة إلى ذلك ، يجب أن يكون لهذا الأمر إدارة مبسطة ، لأنه في هذه الحالة سيتم تنفيذ جميع التكوينات على جهاز افتراضي واحد ، مما يسهل التحديث والنسخ الاحتياطي.

لا قال في وقت أقرب مما فعله.

جزء الخادم

نستخدم جاهزة صورة سحابة لأوبونتو. لا يتطلب أي تثبيت ، فهو يحتوي على كل ما تحتاجه لنشر جهاز افتراضي بسرعة ، و دعم CloudInit يساعد على إنشاء شبكة على الفور وإضافة مفاتيح ssh وتشغيلها بسرعة.

ننشر جهازًا افتراضيًا جديدًا ونقوم أولاً بتثبيته عليه Xorg, nodm и صندوق التدفق:

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

سنستخدم أيضًا config لـ Xorg ، بلطف ممنوح لنا دييغو أونغارو ، مضيفًا قرارًا جديدًا فقط 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، وهو تنسيق أكثر شيوعًا لدفق الفيديو من معظم كاميرات الويب.

لهذا نحتاج شيئين: 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

نظرًا لأن صورتنا لا تتطلب تحديثًا سريعًا ، فقد حددت معدل التحديث: إطار واحد في الثانية (معلمة -r 1) وجودة الضغط: 5 (معلمة -q:v 5)

الآن دعونا نحاول الذهاب إلى http://your-vm:8080/، رداً على ذلك ، سترى لقطة شاشة محدثة باستمرار لسطح المكتب. عظيم! - ما هو مطلوب.

جزء العميل

لا يزال الأمر أسهل هنا ، كما قلت ، سنستخدم Raspberry Pi Model B +.

بادئ ذي بدء ، دعنا نثبته قوس لينكس ARM، لهذا نتبعه تعليمات على الموقع الرسمي.

سنحتاج أيضًا إلى تخصيص المزيد من الذاكرة لشريحة الفيديو الخاصة بنا ، لذلك سنقوم بالتحرير فيها /boot/config.txt

gpu_mem=128

لنقم بتشغيل نظامنا الجديد ولا تنسَ تهيئة حلقة مفاتيح pacman وتثبيتها com.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 من خادمنا.

هذا كل شيء ، يجب أن تظهر صورة من خادمنا على الفور على الشاشة المتصلة. في حالة حدوث أي مشاكل ، ستتم إعادة تشغيل البث تلقائيًا وسيعيد العملاء الاتصال به.

على سبيل المكافأة ، يمكنك تثبيت الصورة الناتجة كشاشة توقف على جميع أجهزة الكمبيوتر في المكتب. لهذا سوف تحتاج 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

الآن زملائك سيكونون سعداء جدا 🙂

المصدر: www.habr.com

إضافة تعليق