OpenOB – Liaison IP par Raspberry Pi

On a régulièrement besoin de pouvoir transmettre du son d’un point A à un point B, lorsque l’on fait un plateau extérieur ou pour relier le studio au site de l’émetteur, le tout avec un temps de délais le plus faible possible. Pour cela vous pouvez utiliser deux Raspberry Pi avec des cartes sons externes et le logiciel OpenOB.

Pour ce tutoriel, j’ai utilisé le matériel suivant :

Attention, le tutoriel est à suivre en partant d’une installation « fraîche » de Raspbian Stretch Lite

OpenOB – Open Audio over IP for Broadcasters

OpenOB est un logiciel audio sur IP conçu pour les broadcasters, les techniciens radio et les intégrateurs systèmes. Le logiciel a été conçu et développé par James Harrison.

Le but du projet est de fournir un cadre simple pour configurer et gérer des liaisons à faible délai audio entre les appareils sur des réseaux IP standard, avec une API de programmation conviviale pour une intégration facile dans d’autres projets.

Source :

Je tenais avant tout à remercier Clod Y-Us pour avoir partager en commentaire sur la page facebook le fait de pouvoir réaliser des liaisons via OpenOB ainsi que Casa36 pour son tuto sur radios-fr.com et ses échanges en messages privés.

Installation :

Nous commençons par mettre à jour le RPI :

$ sudo apt-get update && sudo apt-get -y upgrade && sudo apt-get -y dist-upgrade

Puis on installe les paquets nécessaires pour OpenOB :

$ sudo apt-get -y install python-gst-1.0 gstreamer1.0-plugins-ugly gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-alsa python-gobject python-redis redis-server python-pip

Il faut maintenant configurer le serveur Redis ( l’installation et la configuration de redis-server n’est nécessaire que sur le recepteur ) :

$ sudo sed -i.bak 's/bind 127.*/bind 0.0.0.0/' /etc/redis/redis.conf && sudo service redis-server restart 

Nous pouvons maintenant installer OpenOB :

$ sudo pip install OpenOB

Réception :

Il faut d’abord lancer la machine qui doit recevoir le signal. La commande se compose ainsi : openob « IP de la machine qui émet » « nom de la machine qui reçoit » « nom de la liaison » rx

Nom de la machine qui reçoit : On peut mettre ce que l’on veut, dans l’exemple, j’ai indiqué « recepteur »

Nom de la liaison : On peut mettre ce que l’on veut, dans l’exemple, j’ai indiqué « transmission ». Attention a bien mettre le même nom sur les deux machines

$ openob 192.168.1.109 recepteur transmission rx -a alsa -d hw:1,0 

Emission :

Nous pouvons maintenant lancer la commande sur le RPI qui diffusera. La commande se compose ainsi : openob « IP de la machine qui émet  » « nom de la machine qui émet » « nom de la liaison » tx « IP de la machine qui reçoit »

  • IP de la machine qui émet : 192.168.1.109 (cette IP est a modifier en fonction de votre configuration)
  • Nom de la machine qui émet  : On peut mettre ce que l’on veut, dans l’exemple, j’ai indiqué « emetteur »
  • Nom de la liaison : j’ai indiqué « transmission », comme sur le RPI qui reçoit.
$ openob 192.168.1.109 emetteur transmission tx 192.168.1.161

La commande me renvoie l’erreur suivante :

WARNING - Waiting for audio interface/caps

Nous allons lancer la commande arecord -l pour faire un point sur la carte son que l’on souhaite utiliser :

**** Liste des Périphériques Matériels CAPTURE ****
carte 1: U24XL [U24XL], périphérique 0: USB Audio [USB Audio]
 Sous-périphériques: 1/1
 Sous-périphérique #0: subdevice #0

Dans mon cas, j’utilise une carte son externe USB. Il faut ajouter dans la commande une information pour préciser quelle carte on veut utiliser : hw:1,0. Ce qui nous donne :

$ openob 192.168.1.109 emetteur transmission tx 192.168.1.161 -d hw:1,0

Erreur ! ça ne fonctionne pas, il semble y avoir un problème avec Alsa :

AL lib: (WW) alc_initconfig: Failed to initialize backend "pulse"
AL lib: (EE) alsa_open_capture: Could not open capture device 'default': No such file or directory

On ajoute « -a alsa » dans la commande :

$ openob 192.168.1.109 emetteur transmission tx 192.168.1.161 -a alsa -d hw:1,0 

Victoire ! Tout fonctionne, le son sort du RPI qui reçoit.

19 réflexions au sujet de “OpenOB – Liaison IP par Raspberry Pi”

  1. Salut Lyonel,
    J’ai créé une GUI pour openob, il permet de déployer un instreamer/outstreamer facilement sur des Raspberry et de tout gérer via une interface web. Une sorte de Barix pour quelques euros en soit 😉
    Les captures d’écran:
    https://github.com/mickaelmonsieur/openob-gui/wiki
    Je suis disponible en consultance pour les radios qui seraient intéressées de déployer la solution. (pour cela passer par mon site perso : http://www.mickael.be)

    Répondre
  2. Si tu as des questions n’hésites pas.
    Perso ma config c’est:
    2x Rasbperry Pi, un 1 et un 3 model B, le 1 fait le player et le 3/B l’encodeur.
    2x Behringer UCA222 (une vingtaine d’euros chez thomann)

    ça tourne depuis hier sans souci en opus 128kbit/s
    ce codec est vraiment idéal pour les STL, faible latence, bonne compression…

    Répondre
    • N’ayant qu’un Raspberry de disponible actuellement, je vais tester avec un pc sous debian et mon Raspberry disponible.
      Pour l’instant je rencontre un problème lors du « restart » de php5-fpm …

      J’utilise actuellement une carte son ESI U24 mais j’aimerais créer un boitier avec un raspberry et une carte Audio Injector avec E/S en XLR http://www.audioinjector.net/rpi-octo-hat + Open-OB + OpenOB-GUI

      Répondre
      • Salut,
        Tu ne devrais pas avoir de problème à faire tourner openob-gui sur une Debian amd64 -et non une raspbian lite- il y a juste un risque que la partie adressage ip static ne fonctionne pas si dhcpcd n’est pas installé, il l’est d’office sur raspbian.

        Répondre
        • Les premiers essais d’installation sur Debian ne sont pas concluant.
          J’ai corrigé mon erreur avec PHP5-fpm mais je n’arrive à accéder à la page http://ip-de-la-machine:80/ . Le navigateur reste sur la page d’information de nginx « Welcome to nginx on Debian! »

          Je suis peu à l’aise pour la configuration de départ de Raspbian via la console : clavier, wifi … Et j’aurai voulu essayer avec Pixel mais cela semble déconseillé. Puis-je savoir pourquoi ?

          Répondre
          • Tu as oublié de changer le root dans le fichier de conf nginx si tu vois la page par default. Ou de le redémarrer.
            Pixel est totalement déconseillé car cela alourdi le raspberry avec sa couche graphique totalement inutile et accapare des moments de CPU ce qui dégrade la qualité du flux sonore.

          • Je viens de modifier le root dans le fichier de config de nginx mais ça ne fonctionne toujours pas.
            J’ai ensuite testé avec mon Raspberry et là, ça a fonctionné du premier coup ! J’ai accéder à l’interface web. J’essaie la transmission audio très prochainement.

  3. Bonjour,
    je tente d’installer OpenOB sur 2 RasPi 3B avec Stretch. Il faut utiliser Gstreamer0.10 car OpenOB3.2 ne semble pas fonctionner avec Gstreamer1.0..
    Mais comme mentionné en commentaires par @lyonel le paquet gstreamer0.10-plugins-bad n’existe plus sous stretch…

    L’astuce est donc d’installer le paquet de Jessie :
    ajouter à /etc/apt/sources.list la ligne suivante :
    deb http://archive.rapbian.org/raspbian jessie main contrib non-free rpi deb

    puis un
    $ sudo apt update
    $ sudo apt install gstreamer0.10-plugins-bad

    l’install semble tourner de façon stable.

    Répondre
    • Bonjour @yanns
      Il existe une autre solution pour faire tourner OpenOB sur Raspbian Stretch avec la prise en charge de gstreamer1.0 à la place de gstreamer0.10 grâce au développement de quelques passionnés : https://github.com/JamesHarrison/openob/pull/34
      En attendant que les modifications soient intégrées au code principal, il est possible d’installer OpenOB ainsi :
      $ sudo apt-get install python-gst-1.0 gstreamer1.0-plugins-ugly gstreamer1.0-tools python-gobject python-redis redis-server
      $ sudo sed -i.bak ‘s/bind 127.*/bind 0.0.0.0/’ /etc/redis/redis.conf && sudo service redis-server restart
      $ sudo pip install git+https://github.com/jonty-comp/openob.git@gst1.0

      Répondre
  4. Well done Lyonel! I do have an issue with any platform I’ve tried, RPi and X86, using Jack Audio. Anytime the ‘-a’ is set to ‘jack’ and to visually show what device in the jack rack software I use the ‘-jn’ to name the process. This configuration on version 3.2. Using the following command:

    openob 192.168.0.25 dell transmit tx 192.168.0.29 -a jack -jn DELL

    produces the following:

    2018-08-25 19:50:07,116 – openob.node.dell.link.transmit – INFO – Starting up transmitter
    2018-08-25 19:50:07,119 – openob.node.dell.link.transmit.tx – INFO – Creating transmission pipeline
    2018-08-25 19:50:07,122 – openob.node.dell.link.transmit – ERROR – Transmitter crashed for some reason! Restarting…
    Traceback (most recent call last):
    File « /usr/local/lib/python2.7/dist-packages/openob/node.py », line 45, in run_link
    transmitter = RTPTransmitter(self.node_name, link_config, audio_interface)
    File « /usr/local/lib/python2.7/dist-packages/openob/rtp/tx.py », line 21, in __init__
    self.build_pipeline()
    File « /usr/local/lib/python2.7/dist-packages/openob/rtp/tx.py », line 52, in build_pipeline
    self.source = self.build_audio_interface()
    File « /usr/local/lib/python2.7/dist-packages/openob/rtp/tx.py », line 85, in build_audio_interface
    if self.audio_interface.jack_port_pattern:
    File « /usr/local/lib/python2.7/dist-packages/openob/audio_interface.py », line 33, in __getattr__
    return self.get(key)
    File « /usr/local/lib/python2.7/dist-packages/openob/audio_interface.py », line 27, in get
    value = self.config[key]
    KeyError: ‘jack_port_pattern’

    The error repeats. So before I drag out the Python reference I do what I can to help with this. Transmit or receiver, X86 or Pi, same results. Any ideas?

    Thanks!

    Répondre
  5. Concerning the Jack Audio problem I had, I figured it out. You have to supply the ‘-jp’ to a value for it to complete. The default setting to ‘none’ when no value is entered doesn’t work.

    Répondre
  6. Hi,
    I made all the steps but I receive some error. Can you help me please?

    pi@raspberrypi:~ $ openob 192.168.3.190 recepteur transmission rx -a alsa -d hw:1,0
    Traceback (most recent call last):
    File « /usr/local/bin/openob », line 4, in
    __import__(‘pkg_resources’).run_script(‘OpenOB==4.0.2’, ‘openob’)
    File « /usr/lib/python2.7/dist-packages/pkg_resources.py », line 534, in run_script
    self.require(requires)[0].run_script(script_name, ns)
    File « /usr/lib/python2.7/dist-packages/pkg_resources.py », line 1445, in run_script
    exec(script_code, namespace, namespace)
    File « /usr/local/lib/python2.7/dist-packages/OpenOB-4.0.2-py2.7.egg/EGG-INFO/scripts/openob », line 8, in

    File « build/bdist.linux-armv7l/egg/openob/node.py », line 4, in
    File « build/bdist.linux-armv7l/egg/openob/rtp/tx.py », line 2, in
    File « /usr/lib/python2.7/dist-packages/gi/__init__.py », line 100, in require_version
    raise ValueError(‘Namespace %s not available’ % namespace)
    ValueError: Namespace Gst not available

    Thank you

    Répondre
  7. bonjour,

    Merci pour ce tutoriel qui fonctionne nikel !
    Je fais des tests pour installer OpenVpn sur le raspberry decoder. Cela permettrait de pouvoir connecter l’encoder depuis n’importe quelle connection dhcp sans avoir à connaitre son IP. (je vous tiendrais au courant)
    Petite question , comment modifies t on le bitrate utilisé ?

    merci

    Répondre

Laisser un commentaire