TOOLinux

Le journal du Libre

Faire une Radio Web avec des logiciels libres

mardi 15 mars 2011

Même si le délai est un peu court, j’ai décidé de tenter l’aventure consistant à offrir une retransmission en direct de mes interventions. J’entends et je lis très souvent les regrets des uns ou des autres de ne pas avoir pu assister à une conférence (je ne parle pas des miennes bien rares <img
src='http://philippe.scoffoni.net/wp-includes/images/smilies/icon_smile.gif' alt="webradio VLC streaming icecast " class='wp-smiley' title="Faire une Radio Web avec des logiciels libres" /> ). Il est vrai que ce n’est pas toujours simple entre les impératifs familiaux et professionnel de se ménager un temps pour cela.

Et quand ce n’est pas le temps, c’est la proximité géographique qui fait défaut. Ce n’est pas notre litre de gasoil en route pour les deux euros qui va améliorer cette situation. Il est donc temps de travailler sur ce sujet et je compte m’y investir pas mal dans les mois qui viennent.

Certes, le son c’est bien, mais il manque l’image. La vidéo semble alors la solution, sauf qu’elle est coûteuse en bande passante et ne permet pas de s’immerger dans la conférence, on reste à l’extérieur.

J’utilise le terme immergé volontairement, car ce que je vous proposerais si vous voulez assister à ma conférence sans vous déplacer est de l‘immersion 3D. De bien grands mots qui désignent simplement le fait de venir à la conférence au travers d’une simulation en trois dimensions, autrement dit un univers virtuel. Mais encore une fois j’y reviendrais très prochainement pour vous expliquer tout cela.

Un serveur de streaming

La diffusion de la partie sonore au travers d’un serveur de streaming doit permettre de facilement écouter la partie audio à l’aide de n’importe quel logiciel dédié à la lecture de contenu numérique audio. Parmi eux, on peut citer des outils comme <a
href="http://projects.gnome.org/rhythmbox/">Rhytmbox, <a
href="http://fr.wikipedia.org/wiki/Amarok_%28logiciel%29">Amarok, <a
href="http://fr.wikipedia.org/wiki/MPlayer">MPlayer ou encore <a
href="http://www.videolan.org/vlc/">VLC. Je vous renvoie vers <a
title="Multimédia : Audio" href="http://www.framasoft.net/rubrique163.html">la rubrique ad hoc du site Framasoft pour découvrir d’autres solutions selon votre système d’exploitation.

Diffuser du son, certes, mais le faire avec des logiciels libres c’est mieux. La solution qui revient en général est celle de <a
title="icecast is free server software for streaming multimedia." href="http://www.icecast.org/">Icecast
. Il s’agit d’un serveur de streaming sous licence GPL. Sa mise en œuvre est relativement simple. Il est disponible dans les dépôts de la plupart des distributions GNU/Linux mais aussi sous Windows. Sa configuration se fait au travers d’un fichier dénommé icecast.xml. <a
href="http://www.icecast.org/docs/icecast-2.3.1/icecast2_config_file.html">Ce dernier est bien documenté.

Le principe est d’envoyer sur le serveur de streaming un flux audio encodé dans le format de son choix (Ogg ou MP3 par exemple). Le serveur se chargera de le diffuser aux auditeurs connectés. Dans mon cas je me suis contenté d’utiliser le serveur de streaming mis à ma disposition par l’association <a
href="http://www.mezalab.org/">Meza.

J’ai configuré deux points de “montage”. Rien à voir avec ceux de nos disques durs ou autres supports amovibles. Il s’agit ici de définir le nom de la ressource sur laquelle sera diffusée le flux audio. Les eux flux diffuseront le même contenu, mais seront encodés selon deux algorithmes différents : <a
href="http://fr.wikipedia.org/wiki/Vorbis">Ogg Vorbis et MP3. Ceci afin d’éviter tout souci de support de l’ogg Vorbis qui est format ouvert par les lecteurs multimédias. Mais si vous utilisez un de ceux que je vous ai proposés, vous n’aurez aucun problème.

Un point de montage se défini par au minimum :

<mount>
  <mount-name>/example.ogg</mount-name>
  <username>othersource</username>
  <password>hackmemore</password>
  <max-listeners>1</max-listeners>
</mount>

Le couple username/password est là pour empêcher que n’importe qui utilise votre serveur pour diffuser un flux audio à votre place. Par défaut, mais cela se modifie dans le fichier icecast.xml, le serveur de streaming écoute et diffuse sur le port 8000.

Icecast permet également d’accéder à un petit site web d’administration. Ce même site permet aux auditeurs de récupérer les URL associées aux flux de la Rradio Web.

Un client de streaming

Nous savons donc désormais diffuser un flux audio a un grand nombre de personnes. Il reste encore à le capturer pour l’envoyer au serveur. Pour cela je me tourne à nouveau vers des logiciels libres. La partie est cette fois plus ardue et j’ai bien cru un moment devoir utiliser la partition sous Seven que j’ai laissé sur mon nouvel ordinateur portable.

En fait, les outils des distributions GNU/Linux m’ont semblé plus “conviviaux” et puissants sous cet environnement. Pourtant, j’ai utilisé entres autres brique VLC disponible dans les deux environnements. Bien sûr sous Windows, j’ai trouvé quantité de logiciels payant ou gratuit qui simplifiaient la tâche. Mais je n’ai pas voulu céder aux sirènes de la facilité. Beaucoup auraient probablement jeté l’éponge dés le début. Il faut “avoir la foi” pour persévérer comme je l’ai fait <img
src='http://philippe.scoffoni.net/wp-includes/images/smilies/icon_smile.gif' alt="webradio VLC streaming icecast " class='wp-smiley' title="Faire une Radio Web avec des logiciels libres" /> !

Les outils de ma solution sont les suivants :

  • Ma <a
    href="http://www.linuxmint.com/download_lmde.php">Debian Mint 64bits comme système d’exploitation ;
  • <a
    href="http://www.alsa-project.org/main/index.php/Main_Page">ALSA en replacement de <a
    href="http://fr.wikipedia.org/wiki/PulseAudio">PulseAudio installé par défaut ( ce n’était pas indispensable, mais je ne l’ai découvert que tardivement) ;
  • <a
    href="http://fr.wikipedia.org/wiki/JACK_Audio_Connection_Kit">JACK Audio Connection Kit et qJjack-Control
  • VLC.

Au centre de cet ensemble, le logiciel JACK Audio Connection Kit. Je l’ai découvert en feuilletant un site que je vous recommande si vous voulez comme moi <a
title="LinuxMAO" href="http://linuxmao.org/">vous initier à la musique assistée par ordinateur sous GNU/Linux. J’y ai découvert ce logiciel aux fonctionnalités tout a fait impressionnante. Il permet de connecter des entrées audio (microphone, instruments de musique, lecteur multimédia, etc…) avec des sorties (haut-parleur, enregistreur, etc…). Je vous laisse découvrir <a
href="http://linuxmao.org/tikiwiki/tiki-index.php?page=QJackCtl_TUTO_connecter_des_applications_entre_elles">des exemples de mises en oeuvre chez LinuxMAO.

qJjack-Control s’appuie sur le serveur JACK et ALSA pour fonctionner. ALSA est le serveur de son “historique” des distributions GNU/Linux et il est désormais souvent complété par PulseAudio qui s’intercale entre ALSA et les applications. Cependant, certaines applications ne sont pas compatibles avec PulseAusio.

Comme qJjack-Control refusait de fonctionner et ne détectait pas ALSA, j’ai suivi (approximativement) <a
title="Ubuntu: Make ALSA default instead of PulseAudio" href="http://howto.blbosti.com/2010/04/ubuntu-make-alsa-default-instead-of-pulseaudio/">ce tutoriel en supprimant complètement PulseAudio. En fin d’article l’auteur donne une solution pour éviter cela, mais je ne l’ai vu que plus tard. Soyez tout de même prudent dans cette opération, vous risquez de vous retrouver sans aucun son. Donc, soyez prêt à y passer du temps en cas de difficulté.

Passé cette étape qJjack-Control s’est mis à fonctionner et reconnaissait mon micro et mes haut-parleurs. Le paramétrage de qJjack-Control <a
href="http://linuxmao.org/tikiwiki/tiki-index.php?page=QJackCtl_configuration">est décrit ici avec notamment l’activation de l’option “Temps réel”.

Il me fallait donc utiliser une dernier logiciel pour encoder le flux audio de mon micro et l’envoyer vers le serveur Icecast. Mon choix s’est porté sur le couteau suisse du traitement de flux multimédia VLC. Ce dernier a en effet la possibilité de diffuser une source audio vers un serveur Icecast.

M’étant jusqu’à présent contenté d’utiliser VLC pour ces fonctions de lecteurs audio ou vidéo, je me suis un peu arraché les cheveux pour arriver au résultat final. Si des assistants ont été mis en place pour simplifier la diffusion en streaming, la sauvegarde de configurations m’a paru particulièrement complexe et peu ergonomique. Afin de les conserver, j’ai dû quelque peu ruser et surtout me rabattre sur un bon script bash pour lancer les différentes instances de VLC nécessaires.

<a
href="../wp-content/uploads/2011/03/VLC1.png"><img
class="alignright" style="margin: 5px; float: right;" title="VLC1" src="http://philippe.scoffoni.net/wp-content/uploads/2011/03/VLC1-300x155.png" alt="webradio VLC streaming icecast " width="300" height="155" />Le principe est pourtant simple. On indique à VLC d’utiliser un “périphérique de capture” et on sélectionne JACK Audio Connection Kit. Je laisse les autres paramètres par défaut. Un principe que j’applique quand je ne comprends pas tout à fait ce que je fais. Je clique sur le choix “Diffuser” qui s’affiche en bas dans une liste lorsque l’on clique sur la “flèche” située à côté de “Lire”.

Il est ensuite possible dans les options de diffusion de choisir Icecast, puis de faire “Ajouter” pour saisir les paramètres de connexions au serveur de streaming. Il faut indiquer l’adresse IP ou le nom de celui-ci, le port, le nom du point de montage et le couple login:password.

<a
href="http://philippe.scoffoni.net/wp-content/uploads/2011/03/vlc2.png"><img
class="alignleft size-medium wp-image-3999" style="margin: 5px; float: left;" title="vlc2" src="http://philippe.scoffoni.net/wp-content/uploads/2011/03/vlc2-300x105.png" alt="webradio VLC streaming icecast " width="300" height="105" />Il est important de cocher “Activation du transcodage” pour choisir le format et les options d’encodage du flux audio qui sera envoyé. Faites encore suivant et vous arrivez sur le dernier écran d’options. A cette étape il est important de copier la chaîne indiquée dans la zone “Paramètres généraux du flux de sortie”. Elle sera utilisée dans le fichier bash utilisé pour le lancement de VLC.

En effet à partir de ces dernières j’ai constitué un fichier incluant le lancement de trois instances de VLC avec chacune leur paramétrage de diffusion : ogg, mp3 et enregistrement local au format ogg. La ligne de commande se découpe en trois parties :

La première :

vlc jack ://channels=2:ports=.* :jack-input-caching=1000 :file-caching=300

indique à VLC la source à capturer.Vient ensuite la définition du flux de sortie. C’est là que devient utile la chaîne copiée tout à l’heure, car s’est celle que nous allons réutiliser entre deux guillemets simples en la mettant à la suite de –sout . Cela donne :

—sout ’#transcodevcodec=none,acodec=mp3,ab=256,channels=2,samplerate=44100
:stdaccess=shout,mux=ogg,dst=login:password@serveur-icecast:8000//exemple.ogg

Une fois les trois instances lancées, qJjack-Control les faits apparaître dans les connexions dans la colonne “Clients en écriture” et les relis automatiquement à mes clients en lecture.

<p
style="text-align: center;"><a
href="http://philippe.scoffoni.net/wp-content/uploads/2011/03/vlc3-e1299971581360.png"><img
class="aligncenter size-full wp-image-4000" style="float: center;" title="vlc3" src="http://philippe.scoffoni.net/wp-content/uploads/2011/03/vlc3-e1299971581360.png" alt="webradio VLC streaming icecast " width="600" height="389" />

Le streaming commence alors immédiatement. Un lien apparaît sur la page web publique. Il permet d’obtenir l’URL du flux ou tout simplement en cliquant dessus d’appeler automatiquement le lecteur audio associé à l’extension .m3u. L’URL prend la forme http://adresse_du_serveur_icecast:8000/nom-du-point-de-montage.m3u.

Vous pouvez inclure dans le nom du point de montage l’indication du format d’encodage en ajoutant .ogg ou .mp3. Certains lecteurs audio peuvent en avoir besoin pour identifier le format d’encodage. L’url finale est alors de la forme http://adresse_du_serveur_icecast:8000/exemple.ogg.m3u.

En plus de la capture du microphone, il est possible d’envoyer de la musique. Pour cela toujours aussi simple, lancer une instance de VLC, remplissez votre playlist et lancer l’écoute. Une nouvelle instance vlc va apparaître dans la colonne “Clients en lecture”. Il vous suffit de le connecter aux autres instances VLC dans la colonne “Clients en écriture”. Vous pouvez alors jouer sur les niveaux sonores dans VLC pour donner la priorité à la voix ou à la musique.

Pour le mixage, il serait possible d’utiliser un logiciel comme <a
href="http://www.opendjmix.info/drupal/?q=node/4">OpenDJmix, mais je n’ai pas essayé de le mettre en oeuvre par manque de temps.

Pour l’instant je constate un décalage de 5 à 10 secondes qu’il va falloir que je parvienne à diminuer, pour limiter le décalage avec l’image de la présentation. Merci de laisser vos suggestions en commentaire <img
src='http://philippe.scoffoni.net/wp-includes/images/smilies/icon_wink.gif' alt="webradio VLC streaming icecast " class='wp-smiley' title="Faire une Radio Web avec des logiciels libres" /> .

On peut faire plus simple ?

Tout ceci reste encore artisanal. De plus ici je ne m’attaque qu’à la diffusion vers les auditeurs. Il ne peuvent pas intervenir. On pourrait imaginer une solution basée sur <a
href="http://fr.wikipedia.org/wiki/Asterisk_%28logiciel%29">Asterisk l’autocommutateur téléphonique open source et l’utilisation d’un mixte streaming audio et voix sur IP. Mais c’est un autre chantier et qui prendrait bien plus de temps probablement.

Une autre solution que j’ai testé est <a
title="Internet DJ Console" href="http://idjc.sourceforge.net/">Internet DJ Console. Malheureusement, il n’a pas voulu fonctionner et provoque une “general protection error” dans libtwolame lorsque j’essaie de le connecter au serveur icecast pour diffuser le flux audio. Je ne renonce pas pour autant mais ce sera pour un peu plus tard.

Ce programme m’a semblé d’une grande richesse fonctionnelle avec une gestion des jingles, l’envoi des annonces sur IRC, etc. Il est même possible d’<a
href="http://idjc.sourceforge.net/tutorials_voip.html">interfacer un client voix IP du moment qu’il est compatible avec notre ami JACK. Ceci m’apporterait une réponse concrète pour mon soucis d’interaction dans le cadre d’un atelier.

Philippe SCOFFONI