Miracast Debian + i3wm e Xorg
Utilizzo Debian con una configurazione piuttosto minimale: Xorg, i3 come window manager e senza un desktop environment completo come GNOME o KDE.
Una delle funzionalità che mi serve è poter proiettare senza fili lo schermo del laptop su televisori e display che supportano Miracast. Su Linux è possibile farlo utilizzando GNOME Network Displays, senza dover installare l’intero ambiente GNOME.
Questa configurazione è stata provata su Debian 13 (Trixie), i3 e Xorg con una TV Samsung compatibile con Miracast.
1. Requisiti
Miracast utilizza Wi-Fi Direct (Wi-Fi P2P). Non è quindi necessario che laptop e televisore comunichino attraverso la stessa rete Wi-Fi: viene creata una connessione diretta tra i due dispositivi.
Per prima cosa è necessario utilizzare NetworkManager per la gestione della rete.
Su una Debian minimale:
sudo apt install network-manager
È inoltre necessario che la scheda Wi-Fi e il relativo driver supportino Wi-Fi Direct.
Dopo aver avviato NetworkManager è possibile controllare i dispositivi disponibili con:
nmcli device
Nel mio caso compare:
DEVICE TYPE STATE
wlp0s20f3 wifi connected
p2p-dev-wlp0s20f3 wifi-p2p disconnected
La presenza di:
p2p-dev-wlp0s20f3
indica che NetworkManager dispone dell’interfaccia Wi-Fi P2P necessaria per Miracast.
Lo stato disconnected è normale quando Miracast non è in uso.
2. Installare PipeWire
Questo è un passaggio importante.
Inizialmente GNOME Network Displays riusciva a trovare il televisore e a iniziare la connessione, ma la trasmissione dello schermo falliva.
Nel log compariva:
Failed connect to PipeWire: Couldn't create PipeWire context
La mia installazione utilizzava ancora PulseAudio e PipeWire non era installato.
Su Debian 13 possiamo passare allo stack PipeWire con:
sudo apt install pipewire-audio wireplumber
APT può proporre la rimozione di alcuni componenti di PulseAudio. È
normale: pipewire-pulse fornisce alle applicazioni la compatibilità
con il protocollo PulseAudio.
Dopo l’installazione conviene terminare la sessione e accedere nuovamente oppure riavviare il computer.
Possiamo verificare lo stato dei servizi con:
systemctl --user status pipewire pipewire-pulse wireplumber
Tutti e tre dovrebbero risultare:
active (running)
Possiamo inoltre controllare quale server audio stiamo utilizzando:
pactl info | grep "Server Name"
Nel mio caso:
Server Name: PulseAudio (on PipeWire 1.4.2)
Questo significa che PipeWire è il server audio effettivo, mantenendo la compatibilità con le applicazioni PulseAudio.
3. Installare i portal
In una configurazione i3 minimale installo anche:
sudo apt install \
xdg-desktop-portal \
xdg-desktop-portal-gtk
Possiamo controllare che siano attivi con:
systemctl --user status xdg-desktop-portal
systemctl --user status xdg-desktop-portal-gtk
Nel mio caso:
echo "$XDG_CURRENT_DESKTOP"
restituisce:
i3
mentre:
echo "$XDG_SESSION_TYPE"
restituisce:
x11
Non è quindi necessario utilizzare GNOME o Wayland.
4. Installare GNOME Network Displays
Debian 13 contiene direttamente GNOME Network Displays nei repository:
sudo apt install gnome-network-displays
Non è necessario installare GNOME Desktop.
Nel mio caso preferisco il pacchetto Debian alla versione Flatpak, perché si integra direttamente con il resto del sistema e rende più semplice diagnosticare eventuali problemi.
Possiamo quindi avviarlo normalmente:
gnome-network-displays
GNOME Network Displays inizierà a cercare i ricevitori Miracast disponibili.
Nel mio caso viene rilevato automaticamente un televisore Samsung compatibile con Miracast. Selezionando il televisore e accettando la richiesta sulla TV, viene stabilita la connessione Wi-Fi Direct e lo schermo del laptop viene trasmesso al televisore.
5. Debug
Se la connessione non funziona, GNOME Network Displays può essere avviato con il debug di GLib:
G_MESSAGES_DEBUG=all gnome-network-displays
Questo si è rivelato particolarmente utile per capire dove si interrompeva la connessione.
Nel mio caso il programma riusciva correttamente a:
Found a new sink
Got P2P connection
Found x264enc gst element
Found avenc_aac gst element
Initialization done!
La connessione Wi-Fi Direct e la negoziazione dei codec stavano quindi funzionando.
Il problema era invece l’assenza di PipeWire.
Per diagnosticare la parte di rete può essere utile anche:
sudo journalctl -fu NetworkManager
mentre si tenta la connessione.
6. Alcuni warning non sono necessariamente problemi
Con i3 e Xorg GNOME Network Displays può mostrare alcuni warning anche quando Miracast funziona correttamente.
Ad esempio:
Failed to start Avahi Client
Nel mio caso Avahi non è in esecuzione, ma la TV viene comunque rilevata tramite Wi-Fi Direct.
Compare inoltre:
No such interface “org.freedesktop.portal.ScreenCast”
Con xdg-desktop-portal-gtk e i3/Xorg il portale ScreenCast non è
disponibile, ma GNOME Network Displays utilizza il proprio fallback X11
e la trasmissione funziona comunque.
Infine posso vedere:
No resolution found, falling back to standard FullHD resolution.
GNOME Network Displays sceglie in questo caso automaticamente una risoluzione Full HD. Anche questo, almeno con il televisore utilizzato per la prova, non causa problemi.
7. Pacchetti necessari
Per una nuova installazione Debian minimale, la parte relativa a Miracast del mio script di bootstrap può quindi essere ridotta essenzialmente a:
sudo apt install \
network-manager \
pipewire-audio \
wireplumber \
xdg-desktop-portal \
xdg-desktop-portal-gtk \
gnome-network-displays
A questi vanno naturalmente aggiunti Xorg, i3 e gli altri componenti del sistema.
Il risultato è una configurazione relativamente minimale:
Debian
└── Xorg
└── i3
├── NetworkManager
│ └── Wi-Fi Direct
├── PipeWire
│ └── WirePlumber
├── xdg-desktop-portal
│ └── xdg-desktop-portal-gtk
└── GNOME Network Displays
└── Miracast
Non è necessario installare GNOME Desktop semplicemente per utilizzare GNOME Network Displays.
Conclusione
Miracast funziona quindi anche su una Debian minimale con i3 e Xorg.
Nel mio caso l’elemento che inizialmente mancava era PipeWire: GNOME Network Displays riusciva a individuare il televisore e a negoziare la connessione Wi-Fi Direct, ma non riusciva a completare correttamente la trasmissione dello schermo.
Con NetworkManager, PipeWire/WirePlumber e GNOME Network Displays è invece possibile avere Miracast senza installare un desktop environment completo.