[Tuto] Liaison studio > émetteur avec des raspberryPi

Plus anciens d’abord Plus récents d’abord

2 messages · 9 307 vues · ouvert

Ce sujet faisait partie des archives de l’ancien forum. Son premier et son dernier message ont été repris ; les réponses intermédiaires n’ont pas pu être récupérées.

casa36Membres
·17 messages

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

-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 :

 

1449524618.png

 

 

 

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 0

Pour 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 ;)

Vous avez quelque chose à dire ?

Connectez-vous ou créez un compte pour répondre, en texte ou en message vocal.

casa36Membres
·17 messages

@mrmazure Salut, (désolé pour la réponse tardive)

 

ça doit être possible en faisant une liste de lecture voir un script bash, mais je ne suis pas assez calé pour l'écrire.

 

Pour la liste de lecture si on considère que le morceau est fixe je pense qu'il suffit de mettre le flux http puis une musique, puis le flux, etc... dans un m3u. Je testerais pour confirmer.

 

Sinon la commande mplayer pour lire en aléatoire c'est

mplayer -shuffle ~/dossier_musique/*
Vous avez tout lu.2 messages affichés sur 2 · du plus récent au plus ancien