Artisan Numérique

/système/vidéo/audio/ Créer simplement un noeud multimédia

La structure d'un noeud multimédia dépend énormément de l'usage que l'on en fait. Certain possèdent une télévision et apprécient du coup les media center raffinés à la xbmc avec un htpc dédié, d'autre jouent au légo avec des briques uPNP et adorent acheter ou installer renderer, servers et autres controlers. Le cas de notre foyer est un peu différent. Déjà nous n'avons pas de télévision, ni même de possibilité de recevoir des programmes télévisés (Point d'antenne sur notre toit et une FreeBox HD prenant la poussière au grenier). A la place, un grand mur blanc, un vidéo projecteur, des smartphones (deux androids et un iphone, pas de jaloux), et du vieux matos qui ne demandait qu'à reprendre du service. Le principe c'est donc rapidement imposé de pouvoir lire audio et vidéos à travers le LAN en passant par un vieux portable contrôlé par nos téléphones en WIFI.

Anatomie du Low-Tech-Media-Center

Notre vidéo-projecteur n'étant pas de première jeunesse (résolution max 1024x768), la puissance de la machine chargée de décodage vidéo importait assez peu. Ce fût donc un vieux Packard Bell avec lecteur DVD intégré qui s'y colla. Pour le contrôle (navigation, lancement de la lecture, réglage du volume, etc.) n'importe quel machine sur le réseau peut être utilisé mais la cible reste nos téléphones, et plus particulièrement le mien sous Android.

Coté logiciel cela commence évidement par une distribution GNU/Linux qui sera la plus allégée possible pour démarrer le plus vite possible. Juste au dessus se trouvera un service X11 dépouillé de tout gestionnaire de login, de fenêtre, ou de bureau. Pour le décodage des vidéos, mon choix c'est porté sur VLC qui avec son interface HTTP rend possible le contrôle à distance par un simple navigateur, ou mieux, par un client dédié. Enfin, ce nœud média étant connecté à la chaîne HIFI du salon, je rajoute un inévitable service MPD chargé de la musique d'ambiance de la pièce. Côté serveur de fichier, un simple montage CIFS sur le NAS familiale, comme pour toutes les machines du réseau.

Paramétrage du GNU/Linux

J'aurais pu choisir une distribution plus légère pour cet usage, mais ma règle est "un OS pour tous et moins de maux de crâne pour moi". Ainsi Papy Packard Bell s'est vu reformatté et mis à jour avec une Ubuntu Lucid qui ne cesse de me fasciner par sa capacité à détecter le matos. Bien évidement la distrib a été très fortement écrémée en virant moultes services et paquets inutiles (mono, gnome, pulseaudio, etc). Une fois le ménage terminé, nous pouvons conclure par l'installation de mpd, vlc et smbfs (pour le partage CIFS). Je ne reviendrais pas sur le paramétrage de MPD et CIFS, respectivement détaillé ici et .

Partages CIFS

Ceci fait, nous allons devoir modifier le processus classique de connexion à un GNU/Linux de sorte à tracer à chemin direct et sans intervention entre l'allumage de la machine et l'atterrissage de VLC. La première étape consiste à monter le partage CIFS automatiquement, ce qui se fait très simplement en modifiant /etc/fstab comme ceci :

//nas/partage  /partages  cifs  user,auto,rw,username=box,password=mdp_box,iocharset=utf8 0 0
Ajout d'un partage CIFS à fstab

Cette ligne permettra le montage automatique du partage nommé "partage" sur la machine "nas" vers le point "partages". Le paramètre iocharset=utf8 permet un conversion sans problèmes des accents. Enfin les options user et password sont, vous l'aurez compris, le login et le mot de passe à utiliser pour s'authentifier sur le partage. D'un point de vue sécurité, il sera sage de créer un compte spécifique à la boîte avec des droits limités aux seuls chemins qui l'intéresse (vidéos et musiques).

Connexion automatisée

Étape suivante, l'auto-login. En effet, pour que la machine démarre toute seule, sans l'aide d'un gestionnaire de login comme GDM, il va nous falloir bidouiller un peu. Cela commence par la création d'un compte non-privilégié (ex. box) par la commande useradd box et l'affectation d'un mot de passe (commande passwd box). Ceci fait nous allons configurer l'une des consoles (celles accessibles par CTRL-ALT-F1 à F6) de sorte à automatiquement connecter notre utilisateur box.

Les consoles F1-F6 ne sortent pas de nul part. Elles sont gérées par autant de processus mingetty. Cet outil est un terminal minimaliste pour console teletype (tty). Le lancement de ces processus est contrôlé par le fichier /etc/inittab pour les UNIX SysV. Vous y trouverez une série de commande /sbin/mingetty associés à un numéro de console. Sur Ubuntu les choses changent un peu avec le remplacement du vieux système d'initialisation par UpStart. Dans ce dernier cas, le lancement de mingetty est contrôlé par le fichier /etc/init/ttyX.conf (X étant le numéro de la console).

Dans un cas comme dans l'autre, la connexion automatique de notre utilisateur box passe par l'ajout à l'un des terminaux, de l'option --autologin=box, ce qui nous donne sur ubuntu pour une auto-connexion de l'utilisateur box sur le terminal 6:

# tty6 - getty
#
# This service maintains a getty on tty6 from the point the system is
# started until it is shut down again.

start on runlevel [23]
stop on runlevel [!23]

respawn
exec /sbin/mingetty --autologin=box tty6
modification de /etc/init/tty6

Ceci fait, un petit redémarrage de la machine permet de voir que sur la console 6, l'utilisateur box est bien connecté et que le partage CIFS est correctement monté.

Démarrage de X11

Maintenant que nous sommes connecté, il nous faut lancer automatiquement le service X11. Cela se fait sans grand problème en créant un script de démarrage (.bash_profile) pour bash à la racine du dossier de l'utilisateur box.

#! /bin/sh
if [ $(tty) == /dev/tty6 ]; then
while [ 1 == 1 ]; do
startx
sleep 5
done
fi
~/.bash_profile - Script de démarrage de X11

Le script en lui-même est assez simple. Il s'agit tout d'abord de vérifier que l'on est bien sur la console tty6 ce qui permet de se connecter par les autres consoles, ou par SSH sur le nœud média, sans pour autant lancer X11. La boucle infinie qui encapsule le lancement du service permet, lorsqu'il tombe ou s'arrête, de le relancer automatiquement.

Lancement de VLC

Avant de tester, nous allons ajouter la dernière touche en paramétrant X11 de sorte à lancer automatiquement VLC. Il va pour cela falloir créer un script de démarrage à la racine du dossier utilisateur de box, mais cette fois pour xorg : .xinitrc. Techniquement le fichier .xinitrc est un script lancé par Xorg une fois que tous ses composants matériels et logiciels sont initialisés. C'est une version globale au système de ce script qui permet le lancement de GDM. Dans notre cas, nous allons simplement lancer VNC :

#! /bin/sh
xsetroot -solid black
cvlc
~/.xinitrc - Script de dématrrage pour Xorg

Alors un peu d'explications. Tout d'abord le xsetroot permet simplement de coller un fond d'écran noir. Si vous désirez remplacer cela par une belle image, regardez les options de cette commande, elle est aussi faite pour cela.

Ensuite nous lançons non pas vlc, mais cvlc. En réalité il n'y a pas grande différences entre les deux si ce n'est que le second ne se sent pas obligé d'ajouter une interface visuelle. Notez enfin que le script .xinitrc garde le service x11 en vie. En d'autres termes, c'est vlc qui, tant qu'il existe, maintient le service X11 allumé. Si VLC est arrêté, tué ou s'il plante, le service X11 s'arrête et redémarre 5 secondes plus tard grâce au script .bash_profile que nous avons décrit plus haut.

Paramétrage de l'interface HTTP de VLC

Dernière étape avant les pop-corns, paramétrer VLC. En réalité il n'y a pas grand chose à faire, nous devons simplement nous assurer que VLC fonctionne avec une interface HTTP. Dans une première approche, cette interface est un mini serveur web intégré à VLC permettant, à l'aide d'un navigateur, de commander le lecteur. De manière plus intéressante, cette interface est aussi un moyen simple pour une application dédiée de commander VLC à distance en passant par un réseau IP, sur un protocole HTTP.

Pour paramétrer vlc, le plus simple à mon sens est de se fabriquer un fichier de configuration par défaut en lançant vlc sur une machine, en le fermant, en récupérant le fichier ~/.config/vlc/vlc.rc puis en le plaçant dans le dossier .config/vlc sur le nœud media, dans le compte de l'utilisateur box. Ensuite il ne reste plus qu'à éditer ce fichier pour changer les options qui nous intéressent. Dans notre cas cela consiste essentiellement à modifier la variable extraintf (extra interfaces) comme ceci :

extraintf=http
Modification de la configuration de VLC

Voilà, la machine est prête, il ne reste plus qu'à éteindre, puis allumer. Dans le cas de mon vieux portable 20 secondes suffisent à obtenir l'écran noir et VLC prêt à l'emploi. Il ne reste alors plus qu'à se connecter sur le port 8080 de la machine pour découvrir l'interface WEB et lancer la lecture d'une vidéo.

Contrôle de VLC via le web

Alors ok, l'interface n'est pas superbe, mais elle est complète, et rien ne vous empêche de la modifier (c'est une simple application CSS/XHTML), d'en créer une nouvelle ou dans récupérer une autre sur le net. Il existe par exemple une interface web de replacement dédiées aux téléphones mobile tout en ajax qui marche très bien.

Contrôle de VLC par une application dédiée

Personnellement je n'utilise presque pas cette interface car je lui préfère les applications dédiées qui l'utilisent. Il suffit sur Android Market de faire une recherche sur VLC pour voir que l'offre est riche. Personnellement j'utilise VLC Remote de Peter Baldwin qui fonctionne à merveille et qui en plus est libre (licence GPL v2). En plus, comme toute application bien conçue, il est possible de commander avec plusieurs services VLC.

Conclusion

Voilà, notre noeud multimédia est maintenant prêt et il ne nous reste plus qu'à déguster un bon film. Ceci étant dit, cette solution est plus riche qu'un simple lecteur de vidéos. En effet, il est possible de se connecter en cours de film sur une caméra IP et vérifier que le petit dernier dort bien, se connecter en SSH sur la machine et lancer un diaporama sur le service X11 (voir ici pour savoir comment faire), etc. Les possibilités ne sont limitées que par votre imagination et c'est tout l'avantage d'une solution basée sur une installation standard.