Ma propre webradio avec MPD et Icecast (1)

WebradioC’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

BASF audioMa 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

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

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.

  1. Rafraîchir la base de données de MPD : [U]
  2. Afficher le navigateur de fichiers : [3]
  3. Naviguer avec les touches fléchées et la touche [Entrée] sur [..]
  4. Ajouter un fichier à la playlist avec la touche [Entrée]
  5. Ajouter plusieurs fichiers à la playlist
  6. Afficher la playlist en cours : [2]
  7. 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.

VLC Icecast

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.

Audacious Icecast

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.

Ce contenu a été publié dans CentOS, Documentation Microlinux, avec comme mot(s)-clé(s) , , . Vous pouvez le mettre en favoris avec ce permalien.

2 réponses à Ma propre webradio avec MPD et Icecast (1)

  1. Ronan dit :

    MPD peut très bien se passer d’Icecast, il embarque déjà de quoi streamer son flux 😉

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.