Quand on a besoin de faire la liaison entre le studio et l’émetteur FM de la radio que ce soit en local (via un pont wifi par exemple) ou via ADSL/SDSL/fibre si c'est vraiment éloigné, on a souvent recours à des boitiers type barix pour transporter l'audio et ils sont pour le moins onéreux (400€ pour l'instreamer, 200€ pour l'exstreamer pour les moins chers).
Je vous propose donc de remplacer ces boitiers par des RaspberryPi et vous propose deux solutions avec deux logiciels libres OpenOB et le couteau suisse de l'audio/vidéo, j'ai nommé VLC.
Coté matériel :
- 2 raspberryPi 2 : 40€ l'unité (on peut prendre le modèle B+ pour économiser quelques euros)
- 2 alimentations micro USB : 9€ l'unité
- 2 cartes micro sd 8 Go : 5€ l'unité
- 2 cartes son USB : 13€ l'unité Remarque : il n'y en a besoin dans l'absolu que pour l'encodeur, on peut utiliser la sortie jack du Rpi côté récepteur. On ne trouve cette carte que sur amazon UK (pas trouvé en France), mais a priori toutes les carte son qui fonctionne avec alsa peuvent être utilisées.
- Un boitier : 6€ l'unité
Total : 73€ x 2 = 146€
Côté logiciel :
-image raspbian jessie Téléchagerable ici
- Win32 Disk Imager Téléchargeable ici Pour mettre l'image sur la microSD. Sous Linux on peut utiliser la commande dd.
Je ne détaillerais pas l'installation de raspbian, le net grouille de tutos expliquant comment faire.
Avec openOB
Solution basée sur RTP et donc avec une faible latence, sur le réseau local c'est presque instantané (inférieur à la seconde). Mais qui ne supporte pas le NAT (voir Attention, plus bas).
Prérequis :
Installation de python et gstreamer :
sudo apt-get install python-gst0.10 python-setuptools gstreamer0.10-plugins-base gstreamer0.10-plugins-bad gstreamer0.10-plugins-good gstreamer0.10-plugins-ugly gstreamer0.10-tools python-gobject python-gobject-2 gstreamer0.10-alsa libpython2.7-stdlib
Remarque : Dans le tuto original (fait avec la verison whezzy de debian) il est dit d'installer le paquet gstreamer0.10-ffmpeg, hors dans la version jessie ce paquet n’existe plus mais il n'est apparemment pas indispensable vu que ça fonctionne quand même avec la configuration par défaut.
Passons à la suite. Il faut installer également le serveur redis :
sudo apt-get install redis-server
Nous avons besoin de communiquer avec ce serveur pour initialiser la connexion entre émetteur et récepteur pour ça il faut lui indiquer d'écouter sur toutes les adresses IP, pour ça modifier le fichier :
sudo nano /etc/redis/redis.conf768
Chercher la ligne "bind" et mette à la place de 127.0.0.1 : 0.0.0.0 (ce qui veut dire toutes les adresses).
Pour enregistrer faire Ctrl + o (la lettre, pas zéro) puis pour quitter Ctrl + x
Puis pour prendre en compte les modifications :
sudo service redis-server restart
Installation d'openOB :
sudo esay_install OpenOB
Une fois terminé et la procédure répétée sur les 2 raspberry (on peut cloner la carte SD pour aller plus vite) il est temps de transmettre le flux :
Sur le récepteur :
openob ip-emetteur nom-node nom-link rx
Où :
-ip-emmeteur : l'ip de l’émetteur (ex : 192.168.1.10)
-nom-node : c'est le nom de la machine, on peut mettre ce qu'on veut (ex : reception)
-nom-link : le nom du lien, doit être identique sur l’émetteur et le récepteur (ex : lien)
-rx : on lui dit d'être récepteur
Sur l’émetteur :
openob ip-emetteur nom-node nom-lien tx ip-recepteur
Où :
-ip-emmeteur : l'ip de l’émetteur (ex : 192.168.1.10)
-nom-node : c'est le nom de la machine, on peut mettre ce qu'on veut (ex : emission)
-nom-link : le nom du lien, doit être identique sur l’émetteur et le récepteur (ex : lien)
-ip-recepteur : l'ip du récepteur (ex : 192.168.1.20)
-tx : on lui dit d'être émetteur
Puis on fait entrée de chaque côté, la magie s'opère et on récupère notre flux à l'autre bout !
Autres options utiles, à ajouter à la commande de l’émetteur :
-b : spécifier le débit : 192, 256, 320... (par défaut, sans rien renseigner c'est 96 kb/s) l'encodage se fait avec Opus.
-d : pour changer de carte son (sans doute nécessaire sur l’émetteur avec la carte son supplémentaire) par défaut, c'est hw:0,0 (première carte) la carte USB sera surement notée 1 il faudra donc ajouter à la fin de la commande : -d hw:1,0 Le 2nd zéro correspond à une entrée/sortie de la carte, donc ne pas hésiter à tester les autres possibilités pour tomber sur l'entrée ligne si ça ne fonctionne pas.
Pour savoir exactement ce qu'il en est taper : arecord -l qui va renvoyer un résultat du type :
pi@raspberrypi ~/openob $ arecord -l**** List of CAPTURE Hardware Devices ****card 1: Device [USB Sound Device], device 0: USB Audio [USB Audio] Subdevices: 1/1 Subdevice #0: subdevice #0
Ici on voit que la carte 1, subdevice 0 est responsable de la capture, mais il se peut si la carte a une entrée micro et une entrée ligne que ça affiche une autre ligne subdevice #1, ce qui n'est pas le cas ici. Ce qui donnerait -d hw:1,1
Bref, je pense que vous avez compris le principe.
Pour ceux qui maitrisent l'anglais, voici le tuto original : https://jamesharrison.github.io/openob/tutorial.html
Bien évidemment on peut installer le tout sur des PC classiques (en plus là on aura pas besoin de carte son supplémentaire), c'est juste que le Rpi ça prend pas de place.
PS : Malheureusement je n'ai pas pu réellement tester tout ça car je n'ai qu'un seul raspberryPi, mais il n'y a pas de raison que ça ne fonctionne pas. Pour mon test, j'ai utilisé une machine virtuelle debian comme émetteur et le Rpi comme récepteur.
Attention : Cette solution ne fonctionne pas s'il y'a du NAT (transformation des ip privées en ip publique, ce que font toutes les box des FAI ou les modem/routeur du commerce). Pour s'en servir avec une connexion ADSL, il faut que chaque raspberry soit connecté directement à un modem ethernet (ip publique) de part et d'autre ce qui suppose d'avoir côté studio, une seconde ligne ADSL qui ne s'occupe que de ça. Idem du côté émetteur. Une IP fixe est obligatoire.
Il existe bien des méthodes de contournement pour le NAT mais elles sont compliquées à mettre en place.
Pour le coup il y a avantage au barix avec son protocole BRTP qui fonctionne à travers un NAT. Il y a juste besoin de rediriger le port RTP sur le routeur du côté instreamer, comme on le ferait avec un autre protocole TCP (http, ftp...)
Avec VLC
Cette solution est beaucoup plus souple, elle permet de traverser les NAT et fonctionne avec presque n'importe quelle connexion, elle repose sur http, comme dans le cas d'un serveur shoutcast/icecast. Par contre les latences sont bien meilleurs (5 sec de décalage, mesuré avec une connexion 3G) alors qu'avec Shoutcast, c'est facile 10s voir plus.
Je suppose que raspbian est déjà installé.
Installation de VLC
sudo apt-get install vlc libav-tools
Il ne reste plus qu'a taper côté émetteur :
cvlc alsa://hw:0,0 --sout '#transcode{acodec=vorb,ab=128,channels=2,samplerate=44100}:http{mux=ogg,dst=192.168.1.30:8080/radio}' -cvlc : lance vlc en ligne de commande
-alsa://hw:0,0 : indique la carte son
-transcode : encode l'entrée ligne au format désiré
-acodec : on choisit le codec, ici j'ai pris le codec libre vorbis
-ab : le débit en kb/s, ici 128
-channels : les canaux, 1 (mono) ou 2 (stéréo)
-samplerate : fréquence d’échantillonnage
-http : protocole
-mux : multiplexe le vorbis dans un conteneur ogg
-dst : l'ip locale du Rpi
-8080, le port (on peut mettre ce qu'on veut)
-/radio, indique l'adresse, mais on peut seulement mettre l'ip ça marche aussi
Et côté récepteur :
cvlc http://ip-publique-studio:8080/radio
Et on récupère notre flux.
Important : Après vérification, pour VLC dans le cas où l’émetteur coupe la connexion (reboot, changement d'ip...) la reconnexion côté récepteur ne se fait pas, et même en ajoutant l'argument --http-reconnect, ça ne fonctionne pas. Il faut obligatoirement rebooter le récepteur ou relancer la commande. Je cherche une solution de contournement.
EDIT : Solution finalement trouvé en se servant de mplayer :
sudo apt-get install mplayer2
Il ne reste plus à taper :
mplayer -loop 0 -cache 400 http://ip-publique-studio:8080/radio
Où
-loop 0 : répéter à l'infini
-cache 400 : règle le cache à 400 ko
Remarque : il vaut mieux avoir une IP fixe côté studio, sinon il faudra mettre en place un service de DNS dynamique (Dtdns, no-ip...) Surtout que quand le changement d'ip se fait, la correspondance avec la nouvelle adresse n'est pas instantanée, il faut compter au moins 30min et pendant ce temps le flux est coupé. Par contre côté émetteur l'ip peut-être dynamique ce n'est pas gênant, et là la coupure ne dure que quelques secondes voir 1 minute le temps du changement. Pour connaitre cette ip visitez http://monip.org
Pour accéder au flux de l’extérieur de la radio il faut rediriger la connexion vers le Rpi émetteur, pour ça chercher dans la box (en général 192.168.1.1) la mention NAT/PAT ou redirection de ports.
-service : flux (ou le nom qu'on veut)
-port externe : 8080
-port interne : 8080
-protocole : TCP
-ip du Rpi : 192.168.1.30 (exemple)
Sauvegarder le tout, et ça devrait fonctionner. Un exemple en image sur une livebox pro V2 :
On va maintenant automatiser le démarrage, en cas de reboot imprévu par exemple pour que ça reparte automatiquement :
Créer selon le logiciel choisi :
Pour l'emetteur : (on crée un fichier vierge, toujours pareil ctrl + o pour sauvegarder puis crtl + x pour quitter)
sudo nano /etc/init.d/vlc-txsudo nano /etc/init.d/openob-tx
Pour VLC :
#!/bin/sh#/etc/init.d/vlc-txcvlc alsa://hw:0,0 --sout '#transcode{acodec=vorb,ab=128,channels=2,samplerate=44100}:http{mux=ogg,dst=192.168.1.30:8080/radio}' exit 0Pour pouvoir lancer VLC en tant que root, taper la commande (par défaut il est impossible de le lancer) :
sed -i 's/geteuid/getppid/' /usr/bin/vlc
Pour OpenOB :
#! /bin/sh# /etc/init.d/openob-txopenob 192.168.1.30 emetteur lien tx 192.168.1.10exit 0
Rendre exécutable les scripts :
sudo chmod 755 /etc/init.d/vlc-txsudo chmod 755 /etc/init.d/openob-tx
Ajouter les scripts au démarrage :
sudo update-rc.d vlc-tx defaultssudo update-rc.d openob-tx defaults
Pour le récepteur :
sudo nano /etc/init.d/mplayer-rxsudo nano /etc/init.d/openob-rx
Pour Mplayer :
#!/bin/sh#/etc/init.d/mplayer-rxmplayer -loop 0 -cache 400 http://ip-publique-studio:8080/radioexit 0
Pour OpenOB :
#!/bin/sh#/etc/init.d/openob-rxopenob ip-emetteur nom-node nom-link rxexit 0
Répéter les autres commandes (vlc, démarrage, exécution).
Voilà c'est terminé, j'espère que j'ai été assez clair, et si y'a un soucis vous pouvez me poser la question ;)
