Personal tools
You are here: Home Membres Accueil de fbarriere Docs Transfert de son entre PC
Document Actions

Transfert de son entre PC

by françois Barriere last modified 07-01-2007 21:32 Ce document est sous license creative commons "paternite-partage". (http://creativecommons.org/licenses/by-sa/2.0/fr/)

Faire passer du son (a la vitesse de l'electricité) entre deux PC, jouer un fichier MP3 sur un PC et entendre le son sortir des haut-parleurs d'un autre PC, faire jouer le meme son en meme temps a deux PC... Un petit article pour se prendre la tete avec les serveurs de son et le reseau.

La source du probleme:

Pourquoi donc faire passer du son d'un PC a l'autre? Si vous lisez cet article vous avez peut etre déja une réponse a cette question, sinon pour ma part, voici l'histoire, et sa (ses) morale(s):
Le point de départ était une fete, avec musique et tout et tout. Comme tout bon geek, pour la musique je me tourne du coté du PC avec une bonne collection de MP3, ça doit faire l'affaire. Ensuite, la maison comprends deux pieces a deux étages differents dans lesquelles la musique devait etre diffusée. Voici donc le coeur du probleme: il me fallait donc connecter un PC a une chaine hifi dans une piece, faire la programmation a partir de ce point et que dans l'autre piece le son arrive par un miracle quelconque.
Pour le miracle, sachant que dans la seconde piece se trouve un autre PC, j'ai pensé au wifi (parce que le grand fil entre les deux pieces en fin de soirée c'est risqué, et comme dans l'histoire il y a un escalier, ça sent les urgences au milieu de la nuit).
C'est a ce moment là qu'intervient la question central de cet article: comment faire pour avoir la meme musique au meme moment sur les deux PC en meme temps?

L'annecdote, la vérité historique et la morale:

Je fais ici une parenthese philosophique que ceux que seule la technique interresse peuvent sauter. Voici donc la ce qui s'est finalement passé:
A un certain moment (apres de nombreux échecs), je me suis tourné vers un collegue mais neanmoins ami qui connait bien Linux et lui ai donc posé mon probleme. Sa réponse a été celle du vrai gourou: "utilise un transmetteur TV/audio que tu connecte a la sortie du PC et a la chaine hifi dans la seconde piece". Et voila, paf! Plus d'article, plus d'exploit libre... En meme temps, il a raison le bougre: je voulais faire passer un signal sonore entre deux pieces, et il existe des trucs pour faire cela. autant les utiliser!
Donc je partait dans cette direction. Le soir de la fete, j'était pret (ou je croyais l'etre), j'avais fait quelques tests et la configuration etait la suivante:
  • Au RDC, une chaine hifi, un portable, tous deux reliés a un transmetteur TV (un truc qui transmet le signal TV/audio d'une piece a l'autre). Le portable (babylon) ne contient pas les fichiers MP3 et ne sert qu'a la programmation et la diffusion.
  • Un PC fixe, au sous-sol (gotham) qui contient un disque avec tous les fichiers MP3, connecté au modem-routeur (wifi).
  • Dans la seconde piece, une mini-chaine connectée a l'autre transmetteur (client).
Tout cela marchait bien jusqu'au moment ou le wifi en a eu marre de se battre avec le transmetteur TV/audio (ils utilisent les memes bandes de fréquences) et a déclaré fortait. Et là, plus de connection wifi, donc plus de lien entre le serveur qui contenait les MP3 et le PC qui faisait la programmation. Apres quelques tentatives dans l'urgence, cela c'est terminé au tournevis: le disque dur de gotham a été extrait, placé dans un boitier USB, connecté au portable, la playlist éditée pour changer les chemins d'acces aux fichiers, et c'était repartit...

Pour cloturer l'épisode, la seconde piece (avec gotham et le recepteur)  devait etre réservée aux enfants, qui ont préférés lire des BD et ont donc coupé le son de la mini-chaine...

La transmission de sons sur un reseau avec icecast

Pour faire passer du son sur un reseau il y a icecast. C'est un serveur de son qui permet de faire une radio internet. Icecast, prend en entrée un flux sonore (MP3, OGG, ...) et le diffuse sur un reseau en utilisant le protocole HTTP. Pour faire passer du son d'un ordinateur a un autre avec icecast il faut donc trois éléments:
  1. Une source qui fournisse le flux MP3 ou OGG au serveur icecast et qui gere la programmation.
  2. Un serveur icecast.
  3. Un client sur chaque PC client. Pour cela tout un tas de soft font l'affaire. Xmms, audacious, et meme mplayer (que nous utiliserons pour nos tests).

Le serveur icecast

Pour commencer nous allons rester sur un seul PC et tester la chaine complete. Pour cela il faut installer un serveur icecast. Ensuite il faut ecrire le fichier de configuration (/etc/icecast/icecast.xml) et démarrer le serveur.
Un fichier de configuration de base peut etre:
<icecast>
<authentication>
<source-password>source</source-password>
<admin-user>admin</admin-user>
<admin-password>admin</admin-password>
</authentication>
<listen-socket>
<port>8000</port>
</listen-socket>

<paths>
<basedir>/home/icecast</basedir>
<logdir>/log</logdir>
<webroot>/web</webroot>
<adminroot>/admin</adminroot>
<alias source="/" dest="/status.xsl"/>
</paths>

<logging>
<accesslog>access.log</accesslog>
<errorlog>error.log</errorlog>
<loglevel>4</loglevel>
</logging>

<security>
<chroot>1</chroot>
<changeowner>
<user>icecast</user>
<group>icecast</group>
</changeowner>
</security>
</icecast>
Le serveur sera accessible sur le port 8000. Il faut créer les répertoires /home/icecast/log, /home/icecast/web et /home/icecast/admin.
Ensuite lancer le serveur:
/usr/bin/icecast -c /etc/icecast/icecast.xml

La source sonore

Maintenant que le serveur fonctionne il faut lui fournir un flux sonore. Pour commencer nous allons utiliser ices en mode playlist. Nous prendrons quelques fichiers ogg dont nous allons lister les chemins dans un fichier (playlist.txt), un par ligne. Puis nous allons configurer ices pour lire cette playlist et fournir un flux ogg au serveur icecast. Le fichier de config de ices (/etc/ices/ices.xml) pourra etre:
<?xml version="1.0"?>
<ices>
<background>1</background>
<logpath>/var/log/ices</logpath>
<logfile>ices.log</logfile>
<loglevel>4</loglevel>
<consolelog>0</consolelog>

<stream>
<metadata>
<name>AXUL mega noise</name>
<genre>Mega noise</genre>
<description>Le son AXUL, seulement pour les braves.</description>
</metadata>

<input>
<module>playlist</module>
<param name="type">basic</param>
<param name="file">playlist.txt</param>
<param name="random">0</param>
<param name="restart-after-reread">0</param>
<param name="once">0</param>
</input>

<instance>
<hostname>localhost</hostname>
<port>8000</port>
<password>source</password>
<mount>/axul.ogg</mount>

<reconnectdelay>2</reconnectdelay>
<reconnectattempts>5</reconnectattempts>
<maxqueuelength>80</maxqueuelength>

<encode>
<nominal-bitrate>64000</nominal-bitrate>
<samplerate>44100</samplerate>
<channels>2</channels>
</encode>
</instance>

</stream>
</ices>
Faites bien attention au mot de passe, il doit correspondre avec celui que vous avez definit dans la config du serveur icecast.
Maintenant démarrer ices:
/usr/bin/ices /etc/ices/ices.xml

Ecouter le flux

Pour tester le tout il nous faut un client (sinon on entend rien). Pour cela nous pouvons utiliser mplayer:
mplayer http://localhost:8000/axul.ogg
Normalement vous devriez entendre la musique...
Vous pouvez aussi utiliser votre lecteur préféré (xmms, audacious, etc), l'URL est la meme (http://localhost:8000/axul.ogg).

Ecouter le flux sur un autre PC

C'est bien tout ça, mais un peu compliqué pour juste écouter de la musique sur son PC! Le but est de pouvoir l'écouter sur plusieurs PC... Donc l'étape suivante est le test avec au moins deux PC qui lisent le flux sonore servit par icecast. Pour cela:
mplayer http://babylon:8000/axul.ogg
Parce que le serveur icecast est sur la machine "babylon". Le probleme avec ce genre de manip c'est la synchro sonore. Le jeu des reseau et des tampons rend la synchronisation des deux flux sonores alléatoire.

Fournir un flux a partir d'un lecteur MP3

Il est normalement possible de parametrer ices pour qu'il prenne un flux sonore a partir de la carte son (gérée par ALSA ou OSS), mais les arcanes d'ALSA sont encore trop sombres pour moi et je n'ai pas réussi...
Xmms avait aussi un plugin pour envoyer vers un serveur icecast, mais il semble ne pas etre maintenu et je n'ai réussi qu'a faire planter xmms en essayant de l'utiliser.
Le but étant ici d'utiliser une application avec un interface agréable pour  gérer la liste de lecture (plus ou moins en live) et d'utiliser icecast pour redistribuer le son...

Et avec ESD (pour Rosaire)

Il est possible aussi d'utiliser ESD pour faire transiter le son entre deux PC. Qu'est-ce que ESD? ESD est un serveur de son (le serveur de son de Gnome, les utilisateurs de KDE peuvent passer leur chemin) qui permet de multiplexer plusieurs sources sonores pour les rediriger vers le péripherique son.
Le but de ESD est de permettre a plusieurs applications de partager les ressources sonores du PC (de pouvoir écouter de la musique et d'entendre un "Vous avez de nouveaux messages" lorsque votre boite mail se remplit, par example).
Mais ESD a aussi des fonctions reseau. Il est possible de dupliquer un flux sonore d'un serveur ESD vers un autre.

Ecouter la musique sur un autre PC

Le premier test sera de jouer des sons sur un autre PC. Pour cela, sur le PC qui devra faire du bruit, démarrer un serveur ESD en écoute sur le reseau:
esd -tcp -port 5001 -beeps -bind 192.168.1.2
Le port utilisé sera le 5001 (option -tcp et -port), l'option -beeps demande gentiment a ESD de faire un bip au démarrage (de cette façon vous etes sur qu'il a démarré et que la carte son est disponible pour ESD), et l'option -bind doit forcer l'adresse IP du PC sur lequel ESD tourne. Je sais cela semble idiot, mais sans cette option ESD n'entend rien...
Il faut noter que ESD est assez mal documenté et que les options changent d'une version a l'autre. Ce qui est écrit ici peut donc ne pas fonctionner chez vous...
Il faut maintenant fournir le son au serveur ESD. Pour cela, sur une autre machine (babylon, en 192.168.1.3) lancer xmms ou audacious. Dans les parametres de sortie choisir le plugin ESD, et definir le serveur ESD distant (192.168.1.2, port 5001). Normalement vous devriez entendre la musique sur le PC qui fait tourner le serveur ESD.

Dupliquer le son entre deux PC

Le but ici est d'écouter la meme chose sur deux PC. La premiere étape est de lancer un lecteur MP3, de le parametrer pour utiliser le serveur ESD local (sur babylon=192.168.1.3, pas de serveur distant). Ensuite il faut utiliser deux petits utilitaires amis de ESD: esdmon et esdcat. Le premier (esdmon) permet de recuperer le son servit par un serveur ESD et de le rediriger sur la sortie standard, le second (esdcat) permet de rediriger l'entrée standard vers un serveur ESD. Il faut donc lancer un serveur ESD sur la machine cliente (gotham, en 192.168.1.2), puis sur le serveur (babylon) lancer:
esdmon | esdcat -s 192.168.1.2:5001
Pour ma part, le son sur le client est haché et je n'ai pas encore trouvé la solution...

Et avec MPD

MPD (Music Player Daemon) est un soft qui tourne en tache de fond et fournit les fonctionnalites de lecture de musique comme xmms ou audacious. Le plus c'est que MPD n'est qu'un 'daemon' et qu'il peut etre pilote a partir de clients independants via un protocol simple et qui passe par le reseau. Vous pouvez donc faire tourner MPD sur une machine avec une carte son et le commander a partir d'un autre PC via un client.
Sur le PC avec la carte son (gotham, 192.168.1.2) installer et lancer MPD. Il faut lui specifier dans le fichier de configuration l'endroit ou se trouve les fichiers de musique ainsi que le module de sortie. Par defaut nous choisirons la sortie ALSA (pour sortir sur la carte son du PC). MPD sait chercher dans les sous-repertoiresm donc vous pouvez specifier le repertoire contenant votre musique meme si celle ci est classee par artiste et album sous forme de hierarchie UNIX (repertoire, sous-repertoire, etc).
Le fichier de configuration est par defaut /etc/mpd.conf et les parties importantes sont:
music_directory         "/var/lib/mpd/music"
playlist_directory "/var/lib/mpd/playlists"
pour definir le repertoire qui contient la musique et le repertoire dans lequel seront crees les listes de lectures.
audio_output {
type "alsa"
name "my ALSA device"
device "hw:0,0" # optional
format "44100:16:2" #optional
}

Definit la sortie vers un driver ALSA. Vous pouvez aussi definir plusieurs sorties, le client pourra ensuite selectionner celle qui sera active. Vous pouvez donc aussi activer la sortie vers un serveur icecast si vous voulez servir votre musique vers d'autres PC sur le reseau (et si vous avez garde votre serveur icecast actif).
audio_output {
type "shout"
name "my cool stream"
host "localhost"
port "8000"
mount "/mpd"
password "hackme"
# quality "5.0"
bitrate "128"
format "44100:16:1"
#
# Optional Paramters
# user "source"
# description "here's my long descriptiion"
# genre "jazz"
} # end of audio_output

Ensuite lancez votre serveur MPD:
/usr/bin/mpd /etc/mpd.conf
Connectez vous au serveur avec un client. Par defaut je vous conseille GMPC. Lancer le client et connectez vous au serveur. A la premiere connection le serveur va indexer les fichiers musicaux. Le client peut etre lance a partir du PC sur lequel le serveur MPD tourne ou sur un autre PC. Si vous n'avez selectionne que la sortie icecast, MPD fournira un flux MP3 au serveur icecast et vous pourrez ecouter la musique sur tous les PC connectes au reseau.
Vous pouvez aussi une fois que la liste de lecture a ete generee, vous deconnecter du serveur, fermer le client cela n'arrete pas le serveur.

Les autres solutions:

Il est aussi normalement (d'apres la doc) possible d'utiliser gstreamer avec ESD en utilisant le plugin alsasink pour recuperer la son sur la carte (ALSA) locale et le renvoyer vers un serveur ESD distant avec le plugin esdsrc.



Powered by Plone, the Open Source Content Management System

This site conforms to the following standards: