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.

ffmpeg -re -i <input-file> -map 0:v -map 0:a -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 1M -f mpegts "udp://127.0.0.1:5020/"

On utilise ensuite VLC pour emettre un flux rtp en multicast.

cvlc "udp://@:5020" --sout="#rtp{mux=ts,dst=239.255.255.250,port=5010}"

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
screen_wall.1766223592.txt.gz · Dernière modification : de mirsal