Ceci est une ancienne révision du document !
Le setup du mur d'écrans est compose d'une série de machines Lenovo toutes connecté a un ou deux ecrans en VGA.
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;
}
}
}
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}"
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