Patrice Ferlet
Patrice Ferlet
Créateur de ce blog.
Publié le nov. 2, 2016 Temps de lecture: 4 min

Me suivre sur Mastodon

Faire une présentation avec deux écrans sous linux

Demain matin je vais présenter au BlendWebMix une petite conférence mais une question s’est posé à moi… Comment faire en sorte d’utiliser un bureau étendu tout en faisant un miroir de certaines fenêtres ? Et bien il existe plein de solutions sans avoir besoin d’installer un client particulier. Suivez-moi.

Cela fait… houlala plusieurs mois que je n’ai rien posté. J’en parlais avec Xavier Deneux, un ami, ex-collègue, revu avec plaisirs ce mercredi, et je me suis dit ce soir que l’occasion est trop belle pour ne pas poster un truc que j’utilise régulièrement quand je donne des conférences.

L’objet de la conférence de demain (le jeudi 3 novembre 2016 - Kubernetes et le déploiement continu) fera l’objet un autre billet.

Bon, comment ça se passe ?

En général, si vous êtes conférencier, vous allez avoir à disposition un appareil de projection qui se trouve dans votre dos. Vous allez brancher votre PC et avoir deux possibilités:

  • utiliser un mode “miroir”, donc l’écran de votre portable est projeté directement sur l’écran principal, et par conséquent ce que vous voyez sur votre ordinateur est ce que voit le public
  • utiliser un mode “étendu”, ce qui vous permet d’avoir un écran différent de celui projeté

Dans le premier cas, pas de souci, si ce n’est que vous ne pouvez pas mettre l’écran “secondaire” de LibreOffice ou RevealJS afin de voir la diapo suivante, vos notes, etc… et ça me plait pas

Dans le second cas, si vous n’avez que des slides à montrer, pas de souci. Mais moi je fais souvent des démos, et j’ai besoin d’un terminal (pour vim, des sorties de commandes, ou autre…) ou encore d’un navigateur pour des interfaces Web… Donc à moins de passer d’un mode à l’autre, rien de pratique.

Il existe heureusement des solutions.

Terminal Mirroring avec “script”

Le terminal mirroring est très simple, dans le terminal que vous voulez “partager”, vous tapez:

script -f /tmp/term

Ouvrez ensuite un autre terminal (à montrer au public) dans lequel vous tapez simplement:

tail -f /tmp/term

Et voilà, tout ce que vous tapez dans le terminal de base est vu en temps réel sur le terminal 2. Pour terminer, dans le premier terminal, vous pouvez taper CTRL+D, ce qui va couper la commande “script” et donc fermer “/tmp/term”. Simple et efficace.

Et pour n’importe quelle fenêtre ?

Pour un terminal c’est simple, il existe une méthode plus “universelle” qui fonctionne vraiment très bien. Ça va vous paraitre fou, bête, vous allez même vous dire “mais pourquoi j’y ai pas pensé avant ?” (chose que je me suis dit la première fois): streamer une fenêtre

Et gstreamer est là pour vous ! (encore lui ?!)

Bon, l’idée est d’avoir l’identifiant d’une fenêtre, et d’utiliser le plugin “ximagesrc” puis de tout envoyer dans un “ximagesink”

Flux Gstreamer

Le seul souci, avoir l’ID de fenêtre. Pour ça il faut utiliser une commande assez simple:

xwininfo | awk '/Window id/{print $4}'

Votre curseur se transforme en petite croix, cliquez sur une fenêtre pour sélectionner la fenêtre voulue.

Ensuite coller cet id dans la commande suivante (à la place de ICI_ID):

gst-launch-1.0 ximagesrc xid=ICI_ID ! queue2 ! videoscale ! videoconvert ! queue2 ! ximagesink sync=false

Notez que j’ai ajouté deux “pads” nommés “queue2” pour soulager un peu le CPU. Je n’ai pas d’explication claire sur le sujet, j’ai juste remarqué que, voilà, ça souffle moins coté ventilo…

sync=false permet de laisser tomber des trames vidéo si la vidéo est trop “rapide” pour la lecture, et croyez-moi sans cette option vous aller avoir un paquet de warning dans la console. Et une fois de plus, cette option fera en sorte que votre CPU vous fera des bisous.

Cela ouvre une fenêtre vidéo avec, vous l’avez compris, la vidéo de capture en temps-réel de la fenêtre choisie.

Reste à se faire ça en script bash, en le placant dans votre PATH (moi j’utilise ~/.local/bin/mirror-this):

#!/bin/bash

WID=$(xwininfo | awk '/Window id/{print $4}')
gst-launch-1.0 ximagesrc xid=$WID ! queue2 ! videoscale ! videoconvert ! queue2 ! ximagesink sync=false

Pensez à faire un chmod +x ~/.local/bin/mirror-this ou sur l’emplacement choisi pour le script !

Du coup, quand je dois montrer une fenêtre, je lance ma commande, je clique sur la fenêtre à partager, je la place sur l’écran projeté au mur, et quand j’ai fini, hop un petit CTRL+C dans mon terminal.

Et du coup, là, plus de commande “script”, je l’utilise aussi pour mes terminaux.

Résultat

Tout simplement, je peux utiliser deux écrans différents, un pour avoir mes notes, l’écran de contrôle de mes slides, et pourtant je peux partager certaines choses avec l’auditoire.

J’espère vous avoir donné de quoi vous amuser :)

comments powered by Disqus