Wiki du LOL

Construire ensemble

Outils pour utilisateurs

Outils du site


screen_wall

Ceci est une ancienne révision du document !


Mur d'écrans VGA

Le setup du mur d'écrans est compose d'une série de machines Lenovo toutes connecté a un ou deux ecrans en VGA.

Netboot

Les machines sont démarrées sur le réseau via iPXE, on utilise dnsmasq comme serveur DHCP + TFTP:

#!/bin/sh
IFNAME=enx00e04c68dc36
/sbin/ip addr replace 192.168.212.10/24 dev $IFNAME
/sbin/ip link set dev $IFNAME up
/usr/sbin/dnsmasq \
--no-daemon \
--listen-address 192.168.212.10 \
--bind-interfaces \
-p0 \
--dhcp-authoritative \
--dhcp-range=192.168.212.100,192.168.212.200 \
--dhcp-option=6,192.168.212.10 \
--dhcp-option=3,192.168.212.10 \
--dhcp-host=1C:6F:65:0D:D1:93,wall-1,192.168.212.101 \
--dhcp-host=1C:6F:65:04:F8:88,wall-2,192.168.212.102 \
--dhcp-host=1C:6F:65:0D:D2:49,wall-3,192.168.212.103 \
--bootp-dynamic \
--dhcp-boot=netboot.xyz.kpxe \
--log-dhcp \
--enable-tftp \
--tftp-root=$(pwd)

Nous utilisons un script iPXE servi via TFTP pour démarrer une image debian live modifiée (avec les paquets vlc, xserver-xorg, xinit openssh-server installés et une clé publique SSH autorisée à se connecter en temps que root):

#!ipxe
imgfree
kernel http://192.168.212.10:8042/debian-live/vmlinuz boot=live fetch=http://192.168.212.10:8042/debian-live/filesystem.squashfs initrd=initrd.magic ${cmdline}
initrd http://192.168.212.10:8042/debian-live/initrd
boot

Les images du kernel, de l'initramfs et du système de fichiers racine squashfs sont servies via nginx:

user www-data;
worker_processes auto;
error_log stderr warn;
pid /run/nginx-pxe.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    sendfile on;
    access_log /dev/stdout;
    keepalive_timeout 3000;
    server {
        listen 192.168.212.10:8042;
        root /srv/tftp/;
        index index.html index.htm;
        server_name _;
        client_max_body_size 32m;
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root /var/lib/nginx/html;
        }
    }
}

Production du flux video

On utilise ffmpeg pour convertir le flux initial aux bonnes dimensions en utilisant les filtres scale puis pad. On utilise VLC pour émettre un flux rtp multicast.

ffmpeg -re -stream_loop -1 -i <input_file> -map 0:v -vf "scale=2560x2048:force_original_aspect_ratio=decrease,pad=w=2560:h=2048:x=in_w/2-out_w/2:y=in_h/2-out_h/2" -c:v mpeg2video -b:v 20M -f mpegts - | cvlc - --sout="#rtp{mux=ts,dst=239.255.255.250,port=5010}"

L'émission d'un flux multicast nécessite l'installation d'une route:

ip route add multicast 239.255.255.250 dev $IFACE

Affichage sur les ecrans

On utilise un serveur X sans gestionnaire fenêtre. Puis, on utilise vlc pour decoder le flux rtp multicast avec le splitter wall pour decouper en mosaique.

cvlc --width 1280 --video-splitter=wall --wall-cols=3 --wall-rows=1 --wall-active=0

La géométrie est configurée au lancement des instances clientes, en fonction du placement des écrans:

#!/bin/sh
ssh -oStrictHostKeyChecking=no 192.168.212.101 -lroot -i ~/.ssh/videowall_ed25519 'su - user -c "DISPLAY=:0 xset dpms 0 0 0; DISPLAY=:0 cvlc --video-splitter=wall --wall-rows=2 --wall-cols=1 --wall-active=0 rtp://239.255.255.250:5010"' &
ssh -oStrictHostKeyChecking=no 192.168.212.102 -lroot -i ~/.ssh/videowall_ed25519 'su - user -c "DISPLAY=:0 xset dpms 0 0 0; DISPLAY=:0 cvlc --video-splitter=wall --wall-rows=2 --wall-cols=2 --wall-active=2 rtp://239.255.255.250:5010"' &
ssh -oStrictHostKeyChecking=no 192.168.212.103 -lroot -i ~/.ssh/videowall_ed25519 'su - user -c "DISPLAY=:0 xset dpms 0 0 0; DISPLAY=:0 cvlc --video-splitter=wall --wall-rows=2 --wall-cols=2 --wall-active=3 rtp://239.255.255.250:5010"' &
screen_wall.1766224236.txt.gz · Dernière modification : de mirsal