C’est l’été, il fait chaud, les clients sont à peu près tous partis en vacances et le téléphone ne sonne que très rarement. Entre les sorties baignade à la rivière et les plans escalade à la falaise, il me reste quand-même du temps et de l’inspiration. Du coup j’en profite pour écrire ma documentation sur la configuration d’une webradio sous Linux. Voici donc le premier article dans la série, qui décrit la mise en place et le débogage d’un serveur de flux audio dans mon réseau local.
- The Joy Of Mix
- Les ingrédients
- Un peu de méthode
- Du son pour le serveur
- Installation de MPD
- Mise en service de MPD
- Importer les fichiers audio
- Un client pour se connecter à MPD
- Débogage de SELinux
- Installation du serveur Icecast
- Connecter MPD et Icecast
- Lire le flux audio avec VLC et Audacious
The Joy Of Mix
Ma première compil audio remonte à 1978, si mon souvenir est bon. Une cassette audio BASF orange vif qui conciliait Amanda Lear, Giorgio Moroder, Abba, Queen et Kiss. Pas forcément les morceaux qui passaient à la radio. Plutôt les perles dénichées entre les tubes.
Quarante ans et quelques centaines de compils plus tard, mes goûts musicaux ont pu connaître quelques révolutions coperniciennes. Le principe de la compil n’a pas bougé pour autant. Mettre un pied devant l’autre et un morceau après l’autre, et voir où ça nous mène.
Seulement, voilà. Mes potes et moi, on est des vieux de la vieille, du genre qui gravent les compils sur les CD. Et avec tous les amis qui m’ont demandé au fil des années de bien vouloir leur graver la toute dernière, je me suis parfois retrouvé à copier les CD à une cadence susceptible d’inspirer le respect à la mafia albanaise. Il fallait donc trouver une solution.
Étant donné que j’administre quelques serveurs dédiés dans des datacenters, j’ai eu l’idée de mettre en ligne mes compils sous forme de flux audio publiquement accessible, et de baptiser le tout Radio Novak. Je précise que c’est là un projet que j’entreprends uniquement pour le fun.
Les ingrédients
Mes serveurs tournent tous exclusivement sous CentOS 7. En termes d’ingrédients, voici les composants dont je vais me servir.
- MPD (Music Player Daemon) est un lecteur audio qui utilise une architecture client-serveur.
- Ncmpcpp est un client en ligne de commande qui permet d’accéder à MPD.
- Icecast est un serveur de diffusion de flux.
Un peu de méthode
La mise en place d’un tel serveur de streaming n’est pas forcément une tâche triviale, mais ce n’est pas non plus la mer à boire. Il suffit d’être un peu méthodique dans son approche, et c’est exactement ce que nous allons faire. Je ne vais donc pas me lancer allègrement dans l’installation et la configuration de tous ces composants sur un de mes serveurs de production. Au lieu de cela, je vais d’abord prendre en main chacun des composants sur un PC local qui fait office de serveur de test dans mon bureau.
Du son pour le serveur
La machine amandine.microlinux.lan
est dotée d’une installation minimale de CentOS 7, sans interface graphique. La première chose qu’on va faire, c’est la rendre capable de jouer des fichiers audio.
# yum install pulseaudio pulseaudio-utils alsa-utils
Le plus simple ici, c’est de redémarrer le serveur pour que tout ça se mette en place. Mon approche se veut avant tout pratique et pragmatique. Je vous fais donc grâce de tous les détails déconcertants de Pulseaudio et d’ALSA.
Je branche mes écouteurs sur le serveur et j’ouvre la console de mixage.
# alsamixer
Je règle le volume des canaux de sortie en évitant les distorsions, et en vérifiant bien que les sorties en question ne soient pas désactivées (M
comme Mute). Pour basculer entre les états Muet et Activé, il faut utiliser respectivement les touches [,] et [>]. En passant, je me dis que le gars qui a défini les raccourcis clavier de cette application ferait bien de fumer autre chose que la moquette.
Le paquet alsa-utils
fournit une série de fichiers audio qui permettent de tester le bon fonctionnement de la carte son de la machine.
# aplay /usr/share/sounds/alsa/*.wav
Si tout se passe bien, on entend une voix féminine impassible qui égrène “Front Center, Front Left, Front Right, Rear Center, Rear Left“, etc.
Installation de MPD
Maintenant que j’ai du son sur mon système, je peux installer le premier composant de mon serveur de flux, à savoir MPD. La distribution CentOS ne fournit pas ce paquet, le dépôt tiers EPEL non plus, mais on le trouve dans le dépôt Nux-Dextop. Une fois qu’on a configuré et activé ce dépôt, il suffit d’installer MPD comme ceci.
# yum install mpd
L’installation du paquet crée un utilisateur système mpd
et un groupe système mpd
correspondant.
# grep mpd /etc/passwd mpd:x:996:991:Music Player Daemon:/var/lib/mpd:/sbin/nologin # grep mpd /etc/group audio:x:63:mpd mpd:x:991:
Mise en service de MPD
Avant de démarrer le serveur MPD, on va basculer SELinux en mode permissif. Nous verrons tout de suite pourquoi.
# setenforce 0
Ensuite, on active et démarre le service.
# systemctl enable mpd # systemctl start mpd
Voyons ce que donne ce premier lancement avec la configuration par défaut.
# cat /var/log/mpd/mpd.log Aug 03 13:21 : errno: Failed to open /var/lib/mpd/mpdstate: No such file or directory
Le fichier mpdstate
est censé nous renseigner sur l’état de MPD, par exemple après un redémarrage de la machine. L’astuce consiste ici tout simplement à redémarrer le service pour créer le fichier en question.
# systemctl restart mpd # ls /var/lib/mpd/ mpd.db mpdstate music playlists
Le fichier /etc/mpd.conf
fournit la configuration du serveur. Avant d’aller plus loin, on va effectuer une copie de sauvegarde de ce fichier.
# cd /etc/ # cp mpd.conf mpd.conf.orig
La configuration par défaut est déjà raisonnablement fonctionnelle.
# /etc/mpd.conf
music_directory "/var/lib/mpd/music"
playlist_directory "/var/lib/mpd/playlists"
/var/lib/mpd/mpd.db
log_file "/var/log/mpd/mpd.log"
...
Importer les fichiers audio
À présent, on va fournir une collection de fichiers audio au serveur, qu’on va ranger dans le répertoire /var/lib/mpd/music
. Si l’on dispose d’une collection correspondante de playlists, elles devront être rangées dans /var/lib/mpd/playlists
. Attention à bien définir les permissions adaptées.
# cd /var/lib/mpd # chown -R mpd:mpd music/ playlists/ # find . -type d -exec chmod 0755 {} \; # find . -type f -exec chmod 0644 {} \;
Un client pour se connecter à MPD
Le serveur est donc en train de tourner, et la prochaine étape consiste à installer un client qui nous permette de nous y connecter. Mon choix se porte sur ncmpcpp
, une réécriture en C++ du vénérable client en ligne de commande ncmpc
. Ce client est également fourni par le dépôt de paquets Nux-Dextop.
# yum install ncmpcpp
Je n’ai pas forcément besoin des droits root
pour invoquer le client et me connecter au serveur.
$ ncmpcpp
Le client ncmpcpp
est un outil puissant avec une myriade de fonctionnalités… et de raccourcis clavier correspondants. C’est assez facile de s’y perdre. Dans un premier temps, on va donc voir comment on peut simplement survivre en utilisant cette application.
- Rafraîchir la base de données de MPD : [U]
- Afficher le navigateur de fichiers : [3]
- Naviguer avec les touches fléchées et la touche [Entrée] sur
[..]
- Ajouter un fichier à la playlist avec la touche [Entrée]
- Ajouter plusieurs fichiers à la playlist
- Afficher la playlist en cours : [2]
- Basculer entre les modes d’affichage dans la playlist : [P]
Si tout se passe bien, on devrait déjà avoir du son dans les écouteurs. Apparemment, tout fonctionne. Avant d’aller plus loin, on va éliminer une source de frustration potentielle.
Débogage de SELinux
Les touches [-] et [+] servent respectivement à diminuer et à augmenter le volume sonore. Et lorsqu’on les actionne une première fois, on s’aperçoit que le son disparaît. MPD s’est mis en pause, et pas moyen de le redémarrer. Ici encore, je vous fais grâce des détails exaspérants. C’est tout simplement SELinux qui vient troubler la fête, en nous empêchant de modifier le volume audio.
# sealert -a /var/log/audit/audit.log SELinux is preventing /usr/bin/pulseaudio from execute access on the file /var/lib/mpd/orcexec.4rKUnC (deleted).
Suivons la suggestion qui nous est fournie dans le message d’erreur.
# ausearch -c 'alsa-sink-AD198' --raw # semodule -i my-alsasinkAD198.pp
Relançons ncmpcpp
et essayons de modifier le volume sonore avec les touches [-] et [+]. Cette fois-ci, l’opération se fait sans problèmes. Le souci avec SELinux est réglé.
Installation du serveur Icecast
Le serveur de flux audio Icecast est la dernière brique nécessaire pour notre test local. Le paquet icecast
est fourni par le dépôt de paquets EPEL.
# yum install icecast
L’installation du paquet crée un utilisateur système icecast
et un groupe système icecast
correspondant.
Le serveur Icecast se configure par le biais du fichier /etc/icecast.xml
. Là encore, on va effectuer une copie de sauvegarde avant de modifier quoi que ce soit.
# cd /etc/ # cp icecast.xml icecast.xml.orig
Tant qu’on y pense, on va ouvrir le port 8000 en TCP dans le pare-feu pour permettre aux clients de se connecter au service de flux audio.
Connecter MPD et Icecast
À présent, il va falloir connecter MPD et Icecast. Pour ce faire, on va éditer /etc/mpd.conf
et ajouter une stance dans la section Audio Output
. Le fichier contient déjà un exemple commenté, que j’adapte à mes besoins.
# /etc/mpd.conf ... audio_output { type "shout" encoding "ogg" name "My Shout Stream" host "localhost" port "8000" mount "/mpd.ogg" password "mot_de_passe" bitrate "128" format "44100:16:1" protocol "icecast2" user "source" description "My Stream Description" url "http://amandine.microlinux.lan" genre "mixed" public "no" timeout "2" mixer_type "software" }
Maintenant, je passe à la configuration correspondante du serveur Icecast. MPD se connecte à Icecast par le biais de l’utilisateur source
et du mot de passe défini dans /etc/mpd.conf
. Ces données doivent être reflétées dans /etc/icecast.xml
, dans la section portant sur l’authentification.
<authentication> <!-- Sources log in with username 'source' --> <source-password>mot_de_passe</source-password> <!-- Relays log in username 'relay' --> <relay-password>mot_de_passe</relay-password> <!-- Admin logs in with the username given below --> <admin-user>admin</admin-user> <admin-password>mot_de_passe</admin-password> </authentication>
Dans la configuration par défaut, Icecast permet uniquement aux clients sur la machine locale de se connecter. Il faut donc impérativement commenter ou supprimer la directive bind-address
pour autoriser les connexions en provenance d’autres machines du réseau local.
<listen-socket> <port>8000</port><bind-address>127.0.0.1</bind-address><!-- <shoutcast-mount>/stream</shoutcast-mount> --> </listen-socket>
Au tout début du fichier /etc/icecast.xml
, on va ajouter les deux directives <location>
et <admin>
qui identifient le serveur.
<icecast> <location>Test local Radio Novak</location> <admin>info@microlinux.fr></admin> <limits> <clients>100</clients> <sources>2</sources> <threadpool>5</threadpool> <queue-size>524288</queue-size> <client-timeout>30</client-timeout> <header-timeout>15</header-timeout> <source-timeout>10</source-timeout>
Enfin, la directive <hostname>
fournira le nom d’hôte du serveur de flux.
<hostname>amandine.microlinux.lan</hostname>
Il ne reste plus qu’à activer et (re)lancer les services dans un ordre cohérent.
# systemctl stop mpd # systemctl enable icecast # systemctl start icecast # systemctl start mpd
Lire le flux audio avec VLC et Audacious
Dorénavant, je peux essayer de me connecter au flux audio depuis une machine locale. Sur ma station de travail, j’essaie d’abord de me connecter avec VLC. Dans le menu principal de VLC, j’ouvre Média > Ouvrir un flux réseau et je fournis l’URL de mon flux, en l’occurrence http://amandine.microlinux.lan:8000/mpd.ogg
.
De manière similaire, je peux lire mon flux audio avec Audacious. Dans le menu principal de l’application, j’ouvre Fichier > Lire une URL et je fournis l’adresse de mon flux.
Mon premier test en local a été concluant. Dans mon prochain article, je décrirai l’installation et la configuration du serveur MPD/Icecast sur une machine publique.
MPD peut très bien se passer d’Icecast, il embarque déjà de quoi streamer son flux 😉
Différents chemins mènent à Saint-Bauzille-de-Putois, comme dit un proverbe local un peu moins bien connu.