Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| screen_wall [2025/12/19 18:19] – epickiwi | screen_wall [2026/05/04 14:08] (Version actuelle) – Ordre X, Y mirsal | ||
|---|---|---|---|
| Ligne 2: | Ligne 2: | ||
| Le setup du mur d' | Le setup du mur d' | ||
| + | |||
| + | ===== 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/ | ||
| + | /sbin/ip link set dev $IFNAME up | ||
| + | / | ||
| + | --no-daemon \ | ||
| + | --listen-address 192.168.212.10 \ | ||
| + | --bind-interfaces \ | ||
| + | -p0 \ | ||
| + | --dhcp-authoritative \ | ||
| + | --dhcp-range=192.168.212.100, | ||
| + | --dhcp-option=6, | ||
| + | --dhcp-option=3, | ||
| + | --dhcp-host=1C: | ||
| + | --dhcp-host=1C: | ||
| + | --dhcp-host=1C: | ||
| + | --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, | ||
| + | |||
| + | #!ipxe | ||
| + | imgfree | ||
| + | kernel http:// | ||
| + | initrd http:// | ||
| + | boot | ||
| + | |||
| + | Les images du kernel, de l' | ||
| + | |||
| + | user www-data; | ||
| + | worker_processes auto; | ||
| + | error_log stderr warn; | ||
| + | pid / | ||
| + | | ||
| + | events { | ||
| + | worker_connections 1024; | ||
| + | } | ||
| + | | ||
| + | http { | ||
| + | include / | ||
| + | default_type application/ | ||
| + | sendfile on; | ||
| + | access_log / | ||
| + | keepalive_timeout 3000; | ||
| + | server { | ||
| + | listen 192.168.212.10: | ||
| + | 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 / | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| ===== Production du flux video ===== | ===== Production du flux video ===== | ||
| - | On utilise ffmpeg pour convertir le flux initial aux bonnes dimensions en utilisant les filtres [[https:// | + | On utilise ffmpeg pour convertir le flux initial aux bonnes dimensions en utilisant les filtres [[https:// |
| + | |||
| + | ffmpeg -re -stream_loop -1 -i < | ||
| + | |||
| + | L' | ||
| + | |||
| + | 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 -oStrictHostKeyChecking=no 192.168.212.102 -lroot -i ~/ | ||
| + | ssh -oStrictHostKeyChecking=no 192.168.212.103 -lroot -i ~/ | ||
| + | |||
| + | Pour desactiver la gestion de l' | ||
| + | |||
| + | # Disable screen saving | ||
| + | xset s off | ||
| + | xset -dpms | ||
| + | xset s noblank | ||
| + | |||
| + | ===== PoC ===== | ||
| + | |||
| + | {{: | ||
| + | {{: | ||
| + | {{: | ||
| + | |||
| + | |||
| + | ===== Installation Drags & Nerds ===== | ||
| + | |||
| + | Pour la soirée Drags & Nerds, Une station avec OBS est utilisée pour capturer les performances live et orchestrer la diffusion du flux vidéo. Le flux sortant d'OBS est envoyé vers un socket UNIX auquel est connectée une instance de ffmpeg qui re-encapsule et renvoie le flux vers VLC pour la diffusion en RTP multicast: | ||
| + | |||
| + | #!/bin/sh | ||
| + | mkdir -p /tmp/obs | ||
| + | sudo ip route add multicast 239.255.255.250 dev enp0s25 || true | ||
| + | ffmpeg -fflags nobuffer -re -flags low_delay -f mpegts -listen 1 -i unix:/// | ||
| + | |||
| + | OBS est configuré pour envoyer le flux vidéo vers le socket UNIX sur lequel ffmpeg écoute: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Les différents clients récupèrent le flux RTP multicast et l' | ||
| + | |||
| + | ==== Mur de LED ==== | ||
| + | |||
| + | ffplay -noborder -fflags nobuffer -an -fast -left 0 -top 0 -x 192 -y 384 -i rtp:// | ||
| + | |||
| + | ==== Écran simple ou vidéo-projecteur ==== | ||
| + | |||
| + | DISPLAY=:0 ffplay -sync ext -framedrop -flags low_delay -fflags nobuffer -probesize 32 rtp:// | ||
| + | |||
| + | ==== Affichage partiel sur deux écrans ==== | ||
| + | |||
| + | # 0 - 0 | ||
| + | DISPLAY=:0 ffplay -fflags nobuffer -noborder -x 2560 -y 1024 -left 0 -top 0 -probesize 32 -framedrop -sync ext rtp:// | ||
| - | < | + | # 0 - 1 |
| - | ffmpeg | + | |
| - | On utilise ensuite VLC pour emettre un flux rtp en multicast. | + | # 0 - 2 |
| + | DISPLAY=:0 ffplay -fflags nobuffer -noborder -x 2560 -y 1024 -left 0 -top 0 -probesize 32 -framedrop -sync ext rtp://239.255.255.250: | ||
| - | cvlc "udp:// | + | # 1 - 0 |
| + | DISPLAY=:0 ffplay | ||
| + | # 1 - 1 | ||
| + | DISPLAY=:0 ffplay -fflags nobuffer -noborder -x 2560 -y 1024 -left 0 -top 0 -probesize 32 -framedrop -sync ext rtp:// | ||
| + | # 1 - 2 | ||
| + | DISPLAY=:0 ffplay -fflags nobuffer -noborder -x 2560 -y 1024 -left 0 -top 0 -probesize 32 -framedrop -sync ext rtp:// | ||