Après avoir acheté un nouvel ordinateur portable, Pierre Couy a remarqué qu’il manquait une fonctionnalité essentielle : DisplayPort sur USB-C. Cela a incité Guoy à créer sa propre solution de streaming d’écran virtuel alimentée par un Raspberry Pi 3B.
Le principe est simple, diffusez les données d’écran via Ethernet vers le Raspberry Pi, puis sortez l’écran via le port HDMI du Pi. Cependant, ce projet a nécessité de nombreux processus et compétences différents pour réussir.
L’ordinateur portable précédent de Cuoy était capable de sortir via VGA et HDMI simultanément. Cependant, seul HDMI était disponible pour leur dernier achat, ce qui a incité Cuoy à dépoussiérer un vieux Raspberry Pi 3B et à le presser dans les services pour diffuser un écran supplémentaire. Le choix était simple car le Raspberry Pi était gratuit, mais il y avait quelques compromis qui comprenaient l’équilibre parfait entre la qualité d’image, la latence et la fréquence d’images, compte tenu du port Ethernet de 100 m et du processeur quadricœur.
Les objectifs fixés par Cuoy étaient simples :
- La latence ne doit pas être perceptible lors du défilement ou du déplacement de la souris
- La qualité de l’image doit être suffisamment élevée pour lire un petit texte
- Étant donné que je prévoyais de l’utiliser principalement pour du contenu textuel statique, j’ai décidé d’y aller doucement en me fixant un objectif bas de 10 FPS.
- Si jamais le destinataire du flux prend du retard, il devrait rattraper son retard pour vivre aussi vite que possible
- Utilisez Direct Rendering Manager pour afficher le flux sur le Pi au lieu de dépendre d’un serveur X.
- J’ai examiné les outils de lecture à distance et VNC, car ils semblaient être des solutions à faible latence faciles à utiliser. Cependant, je n’étais pas intéressé par la diffusion en continu des entrées du Pi vers l’ordinateur portable.
De plus, Cuoy souhaitait configurer un serveur DHCP sur le Raspberry Pi, démarrer le logiciel nécessaire au démarrage et configurer l’ordinateur portable pour commencer à diffuser les données de l’écran. Ce dernier objectif nécessitait l’utilisation de xrand pour créer un moniteur virtuel.
La première tâche de Cuoy a été de créer le pipeline vidéo et a choisi d’utiliser ffmpeg sur son ordinateur portable. Après avoir installé un serveur DHCP (udcpd), Cuoy a configuré les deux machines pour qu’elles se parlent. Une fois la connexion confirmée, le premier vrai test était un flux non optimisé sur Ethernet. Le test a été un succès, mais il a échoué sur tous les objectifs. Sans se décourager, Cuoy a continué. Enfin, via une série d’itérations, Cuoy a pu optimiser le flux à un point où il a atteint les objectifs.
L’objectif final était d’étendre l’affichage de l’ordinateur portable à l’aide d’un script bash personnalisé qui générerait un moniteur virtuel, configuré pour répondre aux besoins de Cuoy et diffusé à l’adresse IP du Raspberry Pi. Sur le Pi, un autre script intercepte le flux et sort la lecture via le port HDMI.
Bien sûr, tout cela est exagéré; un adaptateur USB DisplayLink fonctionnerait tout aussi bien et avec peu ou pas de travail. Cependant, le processus complet est fascinant. Il montre ce qui peut être réalisé avec du matériel bon marché, des connaissances Linux et de nombreuses itérations.
Cuoy a un article de blog complet sur le processus, et tous les fichiers de configuration peuvent être trouvés sur le référentiel GitHub respectif.