Streaming layar ke beberapa perangkat melalui jaringan


Ada kebutuhan bagi saya untuk menampilkan dasbor dengan pemantauan pada beberapa layar di kantor. Ada beberapa Raspberry Pi Model B + tua dan hypervisor dengan jumlah sumber daya yang hampir tak terbatas.


Rupanya, Raspberry Pi Model B + tidak memiliki cukup keacakan untuk menjaga browser terus berjalan dan menggambar sejumlah besar gambar di dalamnya, karena itu terjadi bahwa sebagian halaman buggy dan sering crash.


Ada solusi yang cukup sederhana dan elegan, yang ingin saya bagikan dengan Anda.


Seperti yang Anda ketahui, semua Raspberry memiliki prosesor video yang cukup kuat, yang sangat bagus untuk decoding video perangkat keras. Jadi muncul ide untuk meluncurkan browser dengan dashboard di tempat lain, dan mentransfer aliran selesai dengan gambar yang diberikan ke raspberry.


Selain semua ini, seharusnya menyederhanakan manajemen, karena dalam hal ini semua konfigurasi akan dilakukan pada satu mesin virtual, yang lebih mudah untuk diperbarui dan dicadangkan.


Tidak lebih cepat dikatakan daripada dilakukan.


Sisi server


Kami akan menggunakan Cloud Image yang sudah jadi untuk Ubuntu . Tanpa memerlukan instalasi, ini berisi semua yang Anda butuhkan untuk menggunakan mesin virtual dengan cepat, dan dukungan Cloud-Init membantu Anda secara instan mengkonfigurasi jaringan Anda, menambahkan kunci ssh dan dengan cepat menjalankannya.


Kami menggunakan mesin virtual baru dan pertama-tama instal Xorg , nodm dan fluxbox di atasnya:


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

Kami juga menggunakan konfigurasi Xorg yang diberikan kepada kami oleh Diego Ongaro, menambahkan hanya resolusi 1920x1080 baru , karena semua monitor kami akan menggunakannya:


 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 

Sekarang instal Firefox, kita akan memulainya sebagai layanan sistem, jadi pada saat yang sama kita akan menulis file unit untuk itu:


 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 

Kita perlu Xdotool untuk menjalankan firefox secara langsung dalam mode layar penuh.
Menggunakan parameter -url , -url dapat menentukan halaman apa saja sehingga terbuka secara otomatis saat browser dimulai.


Pada tahap ini, kios kami sudah siap, tetapi sekarang kita perlu mengekspor gambar melalui jaringan ke monitor dan perangkat lain. Untuk melakukan ini, kita akan menggunakan kemampuan Motion JPEG , format yang paling sering digunakan untuk streaming video dari sebagian besar kamera web.


Untuk melakukan ini, kita memerlukan dua hal: FFmpeg dengan modul x11grab , untuk mengambil gambar dari X's dan streamEye , yang akan mendistribusikannya ke klien kami:


 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 -r 1 -i :0 -f mjpeg -q:v 5 - 2>/dev/null | streameye' [Install] WantedBy=graphical.target EOT systemctl enable streameye systemctl start streameye 

Karena gambar kami tidak memerlukan pembaruan cepat, saya menunjukkan kecepatan refresh: 1 frame per detik ( -r 1 parameter) dan kualitas kompresi: 5 ( -q:v 5 parameter)


Sekarang kami mencoba membuka http: // your-vm: 8080 / , sebagai tanggapan Anda akan melihat tangkapan layar desktop yang terus diperbarui. Hebat! - itulah yang dibutuhkan.


Bagian klien


Ini masih lebih sederhana di sini, seperti yang saya katakan, kita akan menggunakan Raspberry Pi Model B +.


Pertama-tama, instal ARM Arch Linux di atasnya, untuk ini kami mengikuti instruksi di situs web resmi.


Kami juga perlu mengalokasikan lebih banyak memori untuk chip video kami, untuk ini kami akan mengedit di /boot/config.txt


 gpu_mem=128 

Boot sistem baru kami dan ingat untuk menginisialisasi pacman keyring, instal OMXPlayer :


 pacman -Sy omxplayer 

Hebatnya, OMXPlayer dapat bekerja tanpa Xs, itu sebabnya semua yang perlu kita lakukan adalah menulis file-unit untuk itu dan menjalankannya:


 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 

Sebagai parameter -b http://your-vm:8080/ kami meneruskan URL dari server kami.


Itu saja, gambar dari server kami akan segera muncul di layar yang terhubung. Jika ada masalah, aliran akan dimulai kembali secara otomatis, dan klien akan menyambung kembali ke sana.


Sebagai bonus, Anda dapat mengatur gambar yang dihasilkan sebagai screensaver untuk semua komputer di kantor. Untuk melakukan ini, Anda memerlukan MPV dan 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\ 

Sekarang kolega Anda akan sangat senang :)

Source: https://habr.com/ru/post/id450118/


All Articles