Icecast playback & direct Bullseye

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche

Tutoriel Icecast 2, IceS et Mixx pour Bullseye en réseau local


par Petitchat


Introduction

Vous savez sûrement déjà en arrivant sur cette page qu'Icecast est un logiciel libre inspiré de Shoutcast servant à faire une web radio. Icecast ne fonctionne pas tout seul: il a besoin de sources qui lui fournissent un flux audio. Le serveur Icecast sert à distribuer ce flux aux auditeurs.

Icecast supporte de nombreuses sources aux fonctionnalités différentes selon ses besoins.

Sources Fonction
IceS Diffuser une playlist au format mp3 ou ogg depuis Linux
butt Diffuser en direct une sortie micro ou line
Darkice Sous Linux, enregistre une sortie OSS, ALSA ou Jack, la réencode et l'envoie au serveur de flux
Mixx Logiciel dédié au direct muni d'une GUI et permettant notamment de mixer

la liste complète ici : https://www.icecast.org/apps/

Nous verrons en premier lieu comment paramétrer Icecast et le client IceS pour, une fois mis en pratique,obtenir une webradio ou un juke-box qui diffuse une playlist de mp3. Dans un second temps nous verrons comment paramétrer le logiciel Mixxx dédié au direct et au mixage.


Prérequis (IcesS)

  • une machine sous Debian Bullseyes
  • connectée au réseau local et à Internet
  • un fichier mp3 de test qu'on cherche à diffuser, dans notre exemple « satiscation.mp3 » (du groupe « The Purrin Stones »)

Installation

Nous allons installer plusieurs paquets

  • icecast2, paquet principal
  • libmp3lame-dev, paquet pour encoder en mp3
  • libxml2-dev, paquet pour compatibilité du xml
  • libshout-dev, paquet indispensable
  • libvorbis-dev, pour l'encodage en mp3 et ogg

Concernant le client IceS, la source mp 3, il y a un problème de droits avec la firme Franhofer qui les détient. Du coup on ne trouve pas de paquet IceS dans les sources Debian. Il faut télécharger le code et le compiler manuellement. Pour le faire nous aurons besoin d'un paquet important pour compiler :

  • build-essential

Nous allons essayer de tout installer d'un coup. Mais d'abord une petite mise à jour des dépôts :

Sudo apt update

puis

sudo apt install icecast2 libmp3lame-dev libxml2-dev libshout-dev libvorbis-dev build-essential

Lors de l'installation d'Icecast il est demandé 3 mots de passe, il faut les remplir. Faisons nous maintenant un espace de travail, par exemple sur le bureau un dossier « webradio ».

cd /home/petitchat/Bureau mkdir webradio

Puis dans ce dossier créons un dossier IceS qui va servir à recueillir les sources depuis Internet et les compiler.

cd webradio ; mkdir ices ; cd ices

On télécharge alors les sources depuis Internet :

wget http://downloads.us.xiph.org/releases/ices/ices-0.4.tar.gz

on les décompresse

tar xf ices-0.4.tar.gz

on se place dans le dossier ices-0,4

cd ices-0.4/

Là on lance la commande "configure" qui permet de préparer la compilation et de produire le fichier "make". On utilise deux options de configuration :

  • --with-pic qui permet au code compilé d'être indépendant de sa position (Position Independent Code)
  • --withe-lame qui permet d'avoir disponible l'option de réencodage à la volée

sudo ./configure --prefix=/usr/local --with-pic –with-lame

puis on lance make

sudo make

et enfin

sudo make install

Maintenant nous allons copier le dossier de configuration:

mkdir /etc/ices cp /usr/local/etc/ices.conf.dist /etc/ices/ices.conf

Paramétrage de icecast2

Éditons le fichier /etc/icecast2/icecast.xml

sudo nano /etc/icecast2/icecast.xml

Les fichiers xml exigent une syntaxe rigoureuse, il faut faire très attention. Intéressons nous d'abord à la section d'authentification:

    <authentication>
        <!-- Sources log in with username 'source' -->
        <source-password>hackme</source-password>
        <!-- Relays log in with username 'relay' -->
        <relay-password>hackme</relay-password>

        <!-- Admin logs in with the username given below -->
        <admin-user>admin</admin-user>
        <admin-password>hackme</admin-password>
    </authentication>

Il faut vérifier ou changer les mots de passe et les reporter le moment venu dans les fichiers de configuration des relais et des sources. Le mot de passe « admin-password » sert à la connexion à la page web d'administration. Attention aussi à la section suivante :

 <!-- This is the hostname other people will use to connect to your server.
         It affects mainly the urls generated by Icecast for playlists and yp
         listings. You MUST configure it properly for YP listings to work!
    -->
    <hostname>192.168.1.2</hostname>

    <!-- You may have multiple <listen-socket> elements -->
    <listen-socket>
        <port>8000</port>
        <!-- <bind-address>127.0.0.1</bind-address> -->
        <!-- <shoutcast-mount>/stream</shoutcast-mount> -->
    </listen-socket>

Il faut y renseigner en hostname l'adresse IP à laquelle on pourra joindre le serveur. Il est possible aussi de changer le port. Quand c'est fait on sauvegarde et on quitte l'éditeur. Icecast est déjà paramétré comme service (et automatiquement lancé au démarrage). On redémarre Icecast avec la commande :

sudo systemctl restart iceacast2.service

Si tout s'est bien passé, on peut accéder à la page web d'administration à l'adresse :

http://<hostname>:<port>/

dans cet exemple :

http://192.168.1.2:8000/

Plus tard il sera possible de revenir paramétrer ce fichier, notamment pour limiter le nombre de clients :

<clients>100</clients>

et surtout augmenter la limite du nombre de sources qui est limitée à deux par défaut :

<sources>2</sources>

Il est normal que pour l'instant aucun point de montage n'apparaisse : les points de montage interviennent lors du paramétrage des sources. Pour finir le paramétrage d'Icecast, il faut savoir que le démon se lance avec cette commande :

sudo icecast -c /etc/icecast2/icecast.xml

paramétrage de IceS

Icecast peut convertir simultanément plusieurs flux audio en provenance de plusieurs sources différentes. Il est donc possible de lancer plusieurs instances d'IceS différentes afin d'obtenir simultanément plusieurs sources. Chaque sources a une configuration différente et se caractérise par un point de montage différent. Le point de montage détermine l'adresse à laquelle on pourra atteindre le flux correspondant.

Une chose à faire avant de se lancer dans la configuration à proprement parlée est de créer un dossier qui servira à recueillir la playlist, les fichiers ices.cue, ices.log et ices.pid (si ices est lancé sous forme de démon). Ce dossier est appelé <BaseDirectory> dans le fichier de configuration. Il est fortement conseillé de faire un dossier de base par source(=point de montage= différentes chaînes), sinon les différentes instances de IceS qui partagent le même dossier de base partagent aussi les même fichiers ices.log, ices.cue et ices.pid. Pour construire une arborescence de travail, on se place sur le dossier « webradio » créé précédemment :

cd /home/petitchat/Bureau/webradio

et on créé le dossier de base de notre chaîne « radio petit chat » :

mkdir petitchat

Laissons là cet espace de travail et plaçons nous maintenant dans le dossier contenant le fichier de configuration d'IceS :

cd /etc/ices/

et sauvegardons le fichier de configuration « ices.conf »

sudo cp ices.conf ices.conf.bak

Nous allons personnaliser le fichier configuration pour notre radio « radio petit chat », donc nous appellerons notre fichier de configuration « ices.petitchat.conf ».

Sudo cp ices.conf ices.petitchat.conf

Puis nous pouvons éditer le fichier « ices.petitchat.conf »

sudo nano ices.petitchat.conf

La première section à paramétrer est la section <server> :

    <Server>
      <!-- Hostname or ip of the icecast server you want to connect to -->
      <Hostname>localhost</Hostname>
      <!-- Port of the same -->
      <Port>8000</Port>
      <!-- Encoder password on the icecast server -->
      <Password>hackme</Password>
      <!-- Header protocol to use when communicating with the server.
           Shoutcast servers need "icy", icecast 1.x needs "xaudiocast", and
	   icecast 2.x needs "http". -->
      <Protocol>http</Protocol>
    </Server>

Voici une description des champs importants :

  • <Hostname>, il faut laisser « localhost » si la source et la cible sont sur la même machine, sinon il faut renseigner l'adresse IP du serveur Icecast
  • <Port>, détermine le port auquel atteindre le flux. Il est ainsi possible d'attribuer par exemple un port par source.
  • <Password>, mot de passe pour ce connecter au serveur Icecast, doit être le même mot de passe que celui défini par <source-password> dans le fichier de configuration d'Icecast.

La prochaine section importante est la section <Exécution> :

  <Execution>
    <!-- Set this to 1 if you want ices to launch in the background as a
         daemon -->
    <Background>1</Background>
    <!-- Set this to 1 if you want to see more verbose output from ices -->
    <Verbose>1</Verbose>
    <!-- This directory specifies where ices should put the logfile, cue file
	 and pid file (if daemonizing). Don't use /tmp if you have l33t h4x0rz
         on your server. -->
    <BaseDirectory>/home/petitchat/Bureau/webradio/petitchat/</BaseDirectory>
  </Execution>

Explication des paramètres :

  • <Background>, permet de lancer la source IceS comme un démon, il faut mettre ce paramètre sur 1 pour l'activer.
  • <Verbose>, ce paramètre réglé à 1 permet d'avoir des fichiers journaux plus détaillés.
  • <BaseDirectory>, ici il faut spécifier un dossier de base pour cette source, dossier dans lequel IceS cherche la playlist à jouer et enregistre les fichiers, ices.log, ices.cue et ices.pid si la daemonisation est activée.

Il reste ensuite un certains nombres de champs à examiner :

    <!-- The name of the mountpoint on the icecast server -->
    <Mountpoint>/radiopetitchat.mp3</Mountpoint>
    <!-- The name of the dumpfile on the server for your stream. DO NOT set
	 this unless you know what you're doing.
    <Dumpfile>ices.dump</Dumpfile>
    -->
    <!-- The name of you stream, not the name of the song! -->
    <Name>Radio Petit chat</Name>
    <!-- Genre of your stream, be it rock or pop or whatever -->
    <Genre>félin</Genre>
    <!-- Longer description of your stream -->
    <Description> La radio des chatons relativement doux</Description>
    <!-- URL to a page describing your stream -->
    <URL>http://192.168.1.2:8000/radiopetitchat.mp3</URL>
    <!-- 0 if you don't want the icecast server to publish your stream on
	 the yp server, 1 if you do -->
    <Public>0</Public>

Voilà une description des champs importants :

  • <Mountpoint> défini le point de montage de la source qui ensuite est accessible à l'adresse : « http://<Hostname>:<port><Mountpoint> ».Dans l'exemple, notre source est accessible à l'URL : « http://192.168.1.2:8000/radiopetitchat.mp3. Par soucis de compatibilité avec certains lecteurs audio il est conseillé de choisir un nom de point de montage en minuscule, sans espace ou caractères spéciaux et finir le nom par « .mp3 » pour donner une information sur le format du flux.
  • <Dumpfile>, ne pas changer
  • <Name>,<Genre>,<Description> décrivent le flux. <Name> apparaît dans le lecteur audio du client
  • <URL>, correspond à l l'URL du flux
  • <Public>, cette option permet d'apparaître ou non dans l'annuaire YP, en local on désactive cette option.

Les prochains paramètres concernent le réencodage à la volée. Cela permet d'uniformiser le bitrate et le taux d'échantillonnage des mp3 qui sont diffusés et diminue les bugs qui peuvent survenir si, par exemple, les mp3 ont des bitrates trop hauts ou trop bas. Activer le réencodage n'utilise pas plus de mémoire et très légèrement plus de ressource processeur.

<!-- Stream bitrate, used to specify bitrate if reencoding, otherwise
	 just used for display on YP and on the server. Try to keep it
	 accurate -->
    <Bitrate>128</Bitrate>
    <!-- If this is set to 1, and ices is compiled with liblame support,
	 ices will reencode the stream on the fly to the stream bitrate. -->
    <Reencode>1</Reencode>
    <!-- Number of channels to reencode to, 1 for mono or 2 for stereo -->
    <!-- Sampe rate to reencode to in Hz. Leave out for LAME's best choice
    <Samplerate>44100</Samplerate>
    -->
    <Channels>2</Channels>

Explication des champs :

  • <Bitrate>, Le biterate se mesure en kbits/secondes et mesure la qualité d'un fichier son. La valeur de 128 est reconnue dans la majorité des lecteurs audio
  • <Reencode>, permet d'activer le réencodage à la volée sur 1, désactivé sur 0
  • <Samplerate>, le taux d'échantillonnage se mesure en kHz, c'est un nombre de frames par seconde. Le chiffre de 44100 kHz est accepté par la plupart des lecteurs audio

Les derniers paramétrages se font dans la section <playlist> :

 <Playlist>
    <!-- This is the filename used as a playlist when using the builtin 
	 playlist handler. -->
    <File>playlist.petitchat.txt</File>
    <!-- Set this to 0 if you don't want to randomize your playlist, and to
	 1 if you do. -->
    <Randomize>1</Randomize>
    <!-- One of builtin, perl, or python. -->
    <Type>builtin</Type>
    <!-- Module name to pass to the playlist handler if using  perl or python.
	 If you use the builtin playlist handler then this is ignored -->
    <Module>ices</Module>
    <!-- Set this to the number of seconds to crossfade between tracks.
         Leave out or set to zero to disable crossfading (the default).
    <Crossfade>0</Crossfade>
    -->
  </Playlist>

Avec les champs suivant :

  • <File>, indique le nom du fichier playlist pour cette source. Si le nom de fichier est relatif « playlist.petitchat.txt » alors IceS regarde dans le dossier courant, l'emplacement d'où on lance la commande de lancement de IceS. Ce champs accepte les noms de fichiers absolus qui sont préférables si on ne lance pas IceS toujours du même emplacement.
  • <Randomize>, si ce paramètre est sur 1, alors les pistes de la playlist seront lues aléatoirement, sinon (sur 0) dans l'ordre
  • <Type>, laisser sur « builtin »
  • <Module>,laiser « ices »
  • <Crossfade>, permet un « crossfade », un fondu enchaîné, entre les pistes. Le chiffre indique le nombre de secondes à fondre. Sur 0, les pistes sont lues à la suite sans fondu. L'option « reencode » doit être activée pour bénéficier de cette fonction.

Une fois que le fichier ices.petitchat.conf est prêt on sauvegarde les modifications et on quitte l'éditeur.

Quelques commandes

Script de lancement de IceS

Nous allons maintenant écrire un petit script qui nous servira à lancer notre source « radiopetitchat ». Ce script, appelons le « ices-petitchat.sh », contiendra simplement une ligne de commande de lancement. Celle ci est de la forme :

/usr/local/bin/ices -c <fichier conf> -v

On créé donc notre script de lancement, dans le dossier «/home/petitchat/Bureau/webradio/petitchat/ » créé précédemment (et utilisé en dossier de base pour notre chaîne):

sudo nano ices-petitchat.sh

La première ligne devra être

  1. !/bin/sh

Pour signifier un script, puis

/usr/local/bin/ices -c /etc/ices/ices.petitchat.conf -v

on quitte en sauvegardant et on rend le script exécutable :

sudo chmod +x ices-petitchat.sh

confection d'une playlist de test

Copions le fichier « satiscation.mp3 » qui nous sert de test dans le dossier /webradio/petitchat/. Dans ce même dossier nous allons créer la première playslist de test :

sudo nano playlist.petitchat.txt

Attention a respecter le nom de playlist utilisé dans le champs <File> du fichier de configuration ices.petitchat.conf. La playlist n'accepte que les noms de fichiers avec leur chemin absolu, le seul nom de fichier ne suffit pas. Elle n'accepte pas non plus les jokers (« * »).

On remplit le nom du fichier qu'on souhaite jouer :

/home/petitchat/Bureau/webradio/petitchat/satiscation.mp3

On sauvegarde et on quitte avant d'essayer notre webradio.

Lancer la source

Se placer dans le dossier « /webradio/petitchat/ » puis

sudo ices-petitchat.sh

Si la source est daemonisée, le programme affiche le PID du démon créé. On peut maintenant entendre le flux à une adresse de la forme :

http://<HostName>:<Port><MountPoint>

donc dans notre cas :

http://192.168.1.2:8000/radiopetitchat.mp3

Arrêter la source

Pour stopper la source il faut connaître son PID. Pour ce faire on utilise cette commande :

sudo ps -aux | grep ices

« ps -aux » affiche les processus en cours, le | (pipe) envoie le résultat vers grep, « grep ices » cherche les lignes contenant la chaîne « ices » parmi celles renvoyées par « ps -aux ». On obtient une ligne qui ressemble à ceci :

root 31178 0.6 0.1 49080 2868 ? Ss 23:06 0:19 /usr/local/bin/ices -c /etc/ices/ices.petitchat.conf -v

Le PID correspond au nombre dans le deuxième champs soit ici « 31178 ».

Une autre façon d'obtenir le PID est de lire la valeur contenue dans le fichier ices.pid , fichier qui se situe dans le dossier <BaseDirectory>, soit dans notre cas « /home/petitchat/bureau/webradio/petitchat/ »

On utilise la commande «kill » en root pour arrêter le démon :

sudo kill -9 <PID>

soit dans l'exemple


sudo kill -9 31178

Scripts de confection de playlists

Maintenant que nous sommes en mesure de diffuser un mp3 sur le réseau, il reste le long travail de définir la programmation de notre chaîne, ce qui revient à créer une playlist sophistiquée. Pour y parvenir voilà deux scripts qui peuvent servir d'outils pour créer des playlists facilement en se chargeant de différentes tâches fastidieuse.

Script de conversion de playlist Windows vers Linux

Pour diverses raisons on peut avoir besoin de convertir une playlist faite sous windows en un format qu'IceS sous Linux puisse lire. C'est le cas si par exemple un dossier « musique » contenant les mp3 est partagé sur le réseau local et monté sur notre serveur Debian. La playlist au format m3u faite sous windows aura des lignes qui ressemblent à ceci :

#EXTM3U
#EXTINF:491,Purrin Stones - Satisaction
\\serveur\musique\rock\Purring Stones\Satiscation.mp3

Tandis que le dossier « musique » est accessible depuis le serveur à un chemin tel que  « /mnt/musique/ » . Le fichier mentionné sur la playlist est donc accessible au chemin « /mnt/musique/rock/Purrin Stones/Satiscation.mp3 » .

Plusieurs remarques s'imposent :

  • les arborescences se ressemblent à partir du dossier « musique » mais différent avant
  • les arborescences de windows utilisent des antislash « \ » et celles de Linux des slash « / »
  • le codage des caractères différents pour Windows et Linux fait que le caractère « retour chariot » est lu « ^M » par Linux
  • Les lignes commençant par la dièse « # » sont vues comme des erreurs par Ices qui ne tolère que les lignes faisant référence à des mp3

D'autre part, il faut savoir que si IceS rencontre une erreur fatale dans la playlist comme un fichier absent ou ayant un mauvais format alors il s'arrête purement et simplement. La playlist ne doit pas comporter d'erreur si on veut une lecture continue fiable.

Pour ces raisons nous avons besoin d'un script de conversion entre playlist Windows et playlist IceS/Linux. Ce script aura les fonctions suivantes :

  • changement des antislash en slash
  • changement du mauvais préfixe (ici « \\serveur\ ») en bon préfixe (ici « /mnt/ »)
  • conversion des caractères de retour chariot
  • élimination des lignes diésées

On pourra facilement ajouter ces deux fonctions simples et pratiques :

  • test d'existence du fichier
  • teste s'il porte bien l'extension .mp3 (car un autre type de fichier peut s'être glisser dans la liste)

Préparation du script

Créons dans le dossier « webradio » un dossier « deejay » qui nous servira d'espace de travail pour composer nos playlists :

cd /home/petitchat/Bureau/webradio ; mkdir deejay

Dans ce dossier créons en deux autres, l'un pour stocker nos playlists Windows (qu'on utilisera en entrée du script) et l'autre pour stocker nos playlists Linux (qui seront écrites en sortie)

cd  deejay
mkdir playlistWindows playlistLinux

Pour pouvoir convertir les fichiers du format Dos (Windows) au format unix (Linux) le script utilise le paquet « dos2unix » qu'il faut installer :

sudo apt install dos2unix

Puis nous créons le fichier du script à proprement parlé :

sudo nano convertissor

On y colle se code abondamment commenté :

#!/bin/bash
#Convertissor convertit une playlist Windows en une playlist Linux

#Variables utilisateurs à remplir
#playlist, paramètre obligatoire: entrer un nom au format m3u
playlist='metaltest.m3u';
#prefix2cut,optionnel, c est le préfixe qu'il faut couper, comme c:\
prefix2cut='';
#prefix2paste, optionnel, c est le préfixe à ajouter pour compléter
#le chemin d acces dans le system de fichier Linux
prefix2paste='/home/smbshare/musique/Metal/';

#déclarations
#déclare  ces  variables comme des entiers (integer)
declare -i Lprefix;
declare -i LF3;
declare -i pos;
declare -i nblignes;
declare -i nbignored;

#Lprefix est la longueur du préfixe à couper prefix2cut
Lprefix=${#prefix2cut};
#Lplaylist est le nom de la playlist linux à écrire
Lplaylist=${playlist::-4}.linux.m3u;

#convertissor fonction de conversion
#la ligne est convertie en format linux et testée
function convertissor {
var=$1
#incrémente le compteur de lignes de fichier traitées
let "nblignes+=1";
#  coupe le mauvais préfix
F1=${var:$Lprefix};
#  change les \ en /
F2=${F1//\\/\/};
#  ajoute le bon préfixe
F3=$prefix2paste$F2;
# place les 4 derniers caractères de la ligne dans la
# variable $ext afin de tester s il s agit d'un mp3
LF3=${#F3};
pos=$(($LF3-4));
ext=${F3:${pos}};
# teste  de l'existence du fichier et son extension;
if [ -f "$F3" ] && [ $ext='.mp3' ]; then
 echo "$F3";  
else
  let "nbignored+=1";
  echo "$F3" a été ignoré >> ../errorFile.log ;
fi
}

#initialisation du script
clear;
echo "Le script va s'exectuer avec les variables suivantes:";
echo "playlist à convertir: "$playlist;
echo "playlist à écrire: "$Lplaylist;
echo "préfixe à couper: "$prefix2cut" (longueur:"$Lprefix")";
echo "préfixe à ajouter: "$prefix2paste;
read -p "Pressez une touche pour continuer, Ctrl+C pour sortir " key;
clear;
#efface l ancien fichier d erreur s il existe
if [ -f errorFile.log ]; then rm errorFile.log ; fi


cd playlistWindows;
cp $playlist $playlist.tmp ;
#convertion du format et du jeu de caractère
dos2unix $playlist.tmp;
iconv -f iso8859-15 -t utf8 $playlist.tmp > $playlist.tmp2 ;
#création de la playlist Linux
touch $Lplaylist;

# traitement ligne par ligne
while IFS= read -r line
do
# lit le premier charactère de $line et n opére pas sur les lignes diésées
  if [ ! ${line:0:1} == '#' ]; then convertissor "$line" >> $Lplaylist; fi
done < $playlist.tmp2

#efface le fichier temporaire;
rm $playlist.tmp $playlist.tmp2 ;
#déplace la playlist créée
cd ..
mv ./playlistWindows/$Lplaylist ./playlistLinux/ ;
#sortie du programme
echo $nblignes " lignes de fichier traitées dont " $nbignored " ignorées.";
read -p "convertissor à fait le job, pressez une touche pour sortir" key;
clear ;
exit 0

Le script collé dans l'éditeur on sauvegarde en sortant avec contrôle + X puis on rend le script exécutable avec la commande :

sudo chmod +x convertissor

Fonctionnement du script

En premier lieu il faut disposer d'une playlist faites sous Windows avec l'extension « m3u » et la stocker dans le dossier « playlistWindows ». Il faut ensuite éditer le script et remplir les champs de paramétrages (attention de respecter les ' simples quotes ) :

  • playlist : nom de la playlist Windows à convertir
  • prefix2cut : partie gauche du chemin des fichiers figurant dans la playlist windows, partie qu'il faut couper. Par exemple « D:\ » ou « \\serveur\ »
  • prefix2paste : partie gauche du chemin des fichiers figurant dans la playlis Linux, partie qu'il faut coller pour rendre les fichiers accessible. Par exemple « /mnt/ »

Une fois le script configuré on sauvegarde, on quitte et on lance le script avec sudo :

sudo ./convertissor

D'abord le script affiche les variables avec lesquelles il va procéder à la conversion. Il faut presser une touche, la conversion à lieu. Le programme affiche ensuite le nombre de lignes traitées (sans compter les lignes # diésées) et le nombre de fichiers ignorés.

Si par exemple nous avons convertit une playlist Windows dansesdeschatons.m3u, le script produit la playlist dansesdeschatons.linux.m3u dans le dossier playlistLinux. Pour l'utiliser il faut copier la playlist dans le dossier « webradio/petitchat/ » et la nommer correctement « playlist.petitchat.txt »

cd playlistLinux
sudo cp dansesdeschatons.linux.m3u /home/petitchat/Bureau/webradio/petitchat/playlist.petitchat.txt

et redémarrer IceS.

Script d'extraction

Finalement j'ai décidé de faire une chaîne de musique Punk. Pour ce faire nous avons paramétré ices.punk.conf, il ne reste plus qu'à faire une playlist. Dans notre exemple nous avons tous nos fichiers de musique punk dans /mnt/musique/punk/ . Ce dossier contient des dizaines de sous dossiers correspondant à autant de groupes et chacun de ses sous dossiers contient des albums. Ce script d'extraction permet de générer une playlist qui regroupe tout les mp3 contenu dans un dossier et ses sous dossiers. Dans notre exemple il permet de produire une playlist punk.linux.m3u avec tous nos mp3 de punk.

Préparation du script

Ce script reprend la même arborescence que le script précédant. Le dossier d'où on le lance doit contenir le dossier « playlistLinux » créé précédemment pour stocker les playlists au format Linux. On se place dans le dossier « deejay », on créé le fichier « extractor »  avec l'éditeur :

sudo nano extractor

et on y copie ce code

#!/bin/bash

#chemin où se trouve le script (et le dossier playlistLinux)
chemin="/home/petitchat/Bureau/deejay" ;
#dossier dont il faut extraire les mp3
directory="/mnt/musique/punk" ;
#nom de la playlist à créer
name='punk' ;

#teste si directory existe
if [ ! -d "$directory" ]; then 
  echo $directory " n existe pas, sortie du programme";
  exit 0 ;
fi

cd $directory ;
find -name '*.mp3'> $chemin/$name.tmp ;

while IFS= read -r line
do
  #coupe le préfix
  line2=${line:1};
  #colle le bon préfix
  line3=$directory$line2;
  #teste l existence du fichier, l'enregistre s il existe et le log sinon
  if [ -f "$line3" ]; then
    echo "$line3" >> $chemin/playlistLinux/$name.linux.m3u ;
  else
    echo "$line3" a été ignoré >> $chemin/mp3ext-errorFiles.log ;
  fi
done < $chemin/$name.tmp

#sortie propre du script
read -p "pressez une touche pour sortir" key ;
rm $chemin/$name.tmp
clear ;
exit 0

Puis on rend le fichier exécutable :

sudo chmod +x extractor

Fonctionnement du script

Avant de lancer le script il faut vérifier et changer le cas échéant ces variables au début du code :

  •  « chemin » correspond au chemin où se trouve le script et le dossier playlistLinux
  •  « directory » correspond au chemin du dossier dont on veut extraire les mp3
  • «name » est le nom à donner à la playlist en sortie. La playlist aura un nom final de la forme <name>.linux.m3u

Une fois les changements fait, on lance le script ainsi :

sudo ./extractor

Si les paramètres sont valides un message apparaît en fin de traitement et la playlist est créée dans le dossier « playlistLinux ».

Affichage des métadonnées

Icecast est capable d'afficher les métadonnées contenues dans un MP3. En effet ce type de fichiers contient, en plus de la musique encodée, des informations sur le morceau comme le titre, l'artiste, l'album, le numéro de piste. Elles sont rassemblées sous ce qu'on appelle un ID. Icecast peut donc envoyer ces informations dans le flux afin qu'elles soient lues par le lecteur client. Ceci est même nécessaire si l'on veut que les auditeurs puissent savoir ce qu'ils écoutent. Le problème est que l'ID des mp3 ne respecte pas toujours le même format. Le premier format à être apparu, appelé IDv1, contient peu de champs contrairement à la version apparue par la suite, la IDv2, qui est plus complète mais aussi beaucoup plus complexe. Un mp3 comporte au moins un ID et parfois deux dans les formats v1 et v2. Le hic est que Icecast ne supporte que les mp3 comportant un seul ID au format v1. Si le mp3 comporte un Idv2 ou deux ID, alors l'affichage des titres dans le lecteur client ne fonctionne pas correctement. Il faut nécessairement un seul ID au format v1 et par conséquent corriger les ID des mp3. La tâche est donc fastidieuse ! Heureusement il est possible de gagner beaucoup de temps grâce à des logiciels capables de traiter plusieurs fichiers d'un coups (mp3tag par exemple).

Synchroniser la lecture de deux clients

Icecast, grâce à l'option <burst-size>, permet à des clients présents physiquement au même endroit de lire la même source de façon synchronisé. Exemple : un client lit le flux dans le salon, un autre client lit le flux dans la cuisine, icecast permet de synchroniser les deux, l'écoute du flux est ainsi continue d'une pièce à l'autre. On ne peut pas le faire avec VLC. Lorsqu'on se connecte à un flux émis par VLC et sans l'option <burst-size>, la mémoire tampon du lecteur client met quelques secondes à se charger et ce délais empêche de synchroniser des clients. Au contraire, lorsqu'on se connecte dans un même réseau local physique à un flux Icecast configuré avec l'option <burst-size>, la lecture est quasiment instantanée : au bout de quelques essais de connexion on arrive à une synchronisation correcte. Dans Icecast l'option <burst-size> est activée par défaut, réglée sur 64 Ko. Il n'est normalement pas nécessaire de changer cette valeur. Dans la section <limits> il y a cette ligne :

<burst-size>65535</burst-size>

qui indique le fonctionnement par défaut des différents points de montage. Si l'option est à nouveau spécifiée dans la section de configuration du point de montage alors la cette nouvelle valeur se superpose à la valeur par défaut et la remplace. D'autre part, on trouve dans le fichier icecast.xml l'option  <burst-on-connect>, cette option n'est plus utilisée, on peut la laisser. Elle permettait simplement d'activer ou nom l'option « burst ».

Faire du direct depuis le réseau local

A l'issu de ce que nous avons déjà vu dans ce tutoriel nous savons paramétrer le serveur Icecast2 et configurer un client IceS sur la même machine . Ici nous allons aborder deux nouveaux points : comment diffuser un flux en direct et comment utiliser une source située dans le même réseau local que le serveur Icecast.

Prérequis (Mixxx)

  • Un serveur Icecast2 fonctionnel avec le même paramétrage que précédemment
  • Une machine dans le même réseau local que le serveur Icecast
  • Typiquement cette machine sera un poste de travail avec une GUI, Ubuntu ou Windows font l'affaire. (Dans le tuto on utilise Windows, les utilisateurs de windows ont davantage besoin de tutos). L'important est qu'on puisse y utiliser le logiciel Mixxx.
  • Une bibliothèque de fichiers musicaux mp3 accessible depuis le poste de travail.
  • Sur le poste de travail, on besoin d'un lecteur de média capable de lire les flux audio, par exemple Winamp ou VLC.

configuration d'un point de montage

On a déjà mine de rien paramétré le point de montage de notre radio « Radio Petitchat » : il s'agit, dans le fichier ices.petitchat.conf, de la section <Mountpoint>. Nous allons donc régler les mêmes paramètres.

Éditons le fichier /etc/icecast/icecast.xml

sudo nano /etc/icecast.xml

Après la sections <Limits>, on ajoute cette portion de code :

    <mount>
        <mount-name>/direct</mount-name>
        <username>Petitchat</username>
        <password>miaoumiaou</password>
        <max-listeners>30</max-listeners>
        <public>0</public>
        <charset>ISO8859-1</charset>
        <stream-name>Le direct chez Petitchat</stream-name>
        <stream-description>flux en direct du pc </stream-description>
        <stream-url>http://192.168.1.2:8000/direct</stream-url>
        <genre>direct live</genre>
        <bitrate>128</bitrate>
        <burst-size>65536</burst-size>
    </mount>

Bien sûr on doit remplacer chaque champs par ses propres paramètres. Ceux-ci appellent une explication :

  • <mount> : Balise de configuration d'un point de montage, se ferme avec </mount>
  • <mount-name> :Nom du point de montage. Champs obligatoire.
  • <username> :ID du compte qu'utilisera la source pour se connecter au point de montage. Cette information remplace le compte par défaut paramétré dans la section <authentification>.
  • <password> : Mot de passe du compte.
  • <max-listeners> :Nombre maximal d'auditeurs du flux
  • <public>: détermine si le flux aura un référencement YP (sur 1) ou non. En local on peut désactiver cette option (valeur 0) ;
  • <charset>:Cette option détermine le code de caractères des métadonnées. La valeur ISO8859-1 correspond à un jeu de caractères adapté aux langues européennes </charset>
  • <stream-name>: Le nom du stream qui s'affichera sur le client.
  • <stream-description>: Description succincte du flux, stockée dans les métadonnées. *<stream-url> : URL du flux
  • <genre> : Description du genre du flux, on peut mettre ce qu'on veut.
  • <bitrate> : Le bitrate est l'une des valeurs dont dépend la qualité sonore du flux . Une valeur haute produit un meilleure flux mais prend davantage de ressources système. Une valeur de 128 est un bon compromis. 64 diminue la qualité mais permet davantage de connexions. 256 offre une meilleure qualité mais mobilise davantage de puissance du CPU.
  • <burst-size> :Cette puissante option active le mode « burst » d'Icecast. Lors de la connexion d'un client, le serveur accélère le remplissage de la mémoire tampon. Ainsi la lecture du flux commence presque immédiatement après la connexion du client. Ce champs attend une valeur en octets, une valeur de 65536 (64Ko) convient la plupart du temps.

Une fois que les modifications sont faites il faut les enregistrer et quitter (Ctrl + X). On redémarre le service Icecast avec la commande :

sudo systemctl restart icecast.service

Si l'on se rend sur la page d'administration d'Icecast à l'adresse http://192.168.1.2:8000/ on sera déçu de ne pas voir notre point de montage. Mais pas de panique, c'est tout à fait normal. En effet, et c'est un point important, Icecast ne crée un point de montage qu'à la connexion de la source.

Mixxx

Maintenant que notre point de montage est configuré sur le serveur de flux nous allons passer au paramétrage de la source Mixxx afin de faire du direct. Pourquoi Mixxx ? Le logiciel qu'on choisirai spontanément est plutôt VLC qui est populaire et regorge de fonctionnalités. VLC dispose bien d'une fonction de diffusion de flux. Lorsqu'on choisit l'option « Diffuser », on arrive à une fenêtre « Flux de sortie » qui permet de choisir une connexion vers un serveur Icecast. Intention louable mais qui hélas de fonctionne pas. Un petit tour sur la page d'Icecast au sujet des sources conseillées confirme que VLC n'est pas dans les sources conseillées alors qu'il est le premier de la liste des clients. En premier lieu il convient alors de télécharger Mixxx et d'installer le logiciel sur notre poste de travail muni d'une GUI. La page de téléchargement est ici : https://mixxx.org/download/#stable Il faut suivre les indications d'installation pour son système d'exploitation.

Premier lancement et configuration

Lors du chargement Mixxx examine la configuration audio du poste de travail. Sur Windows il est possible d'obtenir un message d'erreur « No output devices », il ne faut pas s'alarmer et cliquer sur « Continue ». Pour diffuser en direct Mixxx n'a pas besoin de périphérique de sortie son. Le premier chargement de Mixx donne aussi lieu à un scan du disque afin de recenser les fichiers audio disponibles et constituer une bibliothèque. Il est possible par la suite de relancer le scan pour mettre la médiathèqe de Mixxx à jour. Une fois le logiciel chargé, la fenêtre principale apparaît. Le premier réglage concerne la sortie son qu'il faut désactiver. En effet, si l'on utilise effectivement le poste de travail pour lire le direct, nous n'allons pas utiliser la sortie son de Mixxx mais un lecteur de flux client, par exemple Winamp ou VLC, qui liront le flux.

  • Choisir Option/Préférences (Ctrl+P)
  • La première section s'appelle « Sound Hardware ». Dans cette section, il faut trouver le champs « Output/Master » et le régler sur « --- » (pas de sortie audio)

(<screenshot 1> à faire valider)

Dans un second temps nous configurons la diffusion du flux vers le serveur Icecast.

  • Choisir dans le menu de gauche la section « Diffusion en direct »
  • Normalement par défaut il existe une connexion appelée « Connexion 1 » et sa coche « Activé » est cochée. Nous allons paramétrer cette connexion. Si elle n'existe pas il faut la créer en cliquant sur « Create new connection ».
  • Dans le groupe de contrôles « Server connection » nous ajoutons nos paramètres.
  • Régler <Type> sur « Icecast 2 ».
  • Devant <Mount> on renseigne le nom du point de montage, dans notre cas c'est « /direct ».
  • <Host> prend la valeur de l'adresse IP du serveur Icecast, dans notre cas il s'agit de « 192.168.1.2 ».
  • <Port> prend la valeur du port d'écoute d'Icecast, on a laissé cette valeur à 8000.
  • Devant <Login> on renseigne l'ID de connexion au point de montage et devant <Password> on renseigne le mot de passe. Dans notre cas il s'agit de Petitchat:miaoumiaou.

Le menu contient d'autres paramètres réglables, il sera possible d'y revenir plus tard.

  • On valide en cliquant sur « Appliquer » puis « OK »

(<screenshot 2> à faire valider)

Remarques :

  • Le logiciel ne consomme que peu de ressources CPU sauf lorsqu'il charge un morceau, on enregistre alors un petit pic d'activité. Coté mémoire le logiciel prend plus ou moins 600 Mo
  • Malgré cela Mixxx ralentit énormément certains logiciels qu'on voudrait utiliser simultanément. Par exemple, sous Windows 7, Mixxx peut ralentir une machine virtuelle VMWare jusqu'à la faire planter.

Première diffusion avec Mixxx

L'interface de Mixxx est complexe et offre une large gamme de fonctions utiles pour un DJ. Nous allons nous contenter de diffuser un simple morceau en guise de test. La fenêtre comporte 4 parties distinctes organisées de haut en bas.

  • La barre de menu
  • Une zone d'affichage de la forme d'onde des morceaux diffusés
  • Une zone comportant les platines (Decks), une table de mixage
  • Un fenêtrage en bas servant à afficher la bibliothèque de son, les caisses, les playlists...

Procédons maintenant à une première diffusion en direct :

  • Pour passer en ligne, cliquer sur « On Air » dans la barre de menu à droite. A ce moment Mixxx tente une connexion au serveur Icecast. Si la connexion a lieu, alors le voyant passe au vert. A ce moment on peut vérifier en se rendant sur la page web d'administration d'Icecast que le point de montage « direct » a bien été créé.
  • On peut donc à ce moment se connecter avec notre logiciel client à l'url http:/192.168.1.2:8000/direct. On peut entendre le silence que l'on diffuse ! Mais une chanson serai bien aussi.
  • Normalement après le scan par Mixxx des morceaux présents sur la machine il y a dans la bibliothèque en bas des titres à diffuser. Sur l'un d'eux on clique avec le bouton gauche ce qui fait apparaître un menu contextuel richement fourni.
  • Dans ce menu on choisi « Load to / Deck / Deck 1 ». Ceci a pour conséquence de charger le morceau choisi dans la platine de gauche.
  • Il ne reste qu'à cliquer sur le bouton « play/pause » sous la platine 1. La forme d'onde se met à défiler, les vu-mètres prennent des couleurs. Le temps que le logiciel encode le morceau et envoie le flux vers le serveur Icecast engendre un délais de plusieurs secondes entre la lecture sur Mixxx et la lecture sur le logiciel client. Mais on entend la musique !

Conclusion

C'est dommage que dans VLC la diffusion vers un serveur Icecast ne fonctionne pas, cela aurait été plus simple. Maintenant que nous avons Mixxx d'installé et configuré, il reste à apprendre à l'utiliser. A l'usage ça va vite. Il faut définir ou importer des playlists et utiliser l'Auto-DJ. Si l'on souhaite synchroniser plusieurs clients dans le réseau local il faut relancer la lecture une fois ou deux sur chaque client.