tutoriel, DIY : streaming audio multiroom avec deezer hifi, le codage flac, et les logiciels libres ffmpeg + icecast2

Objectif HiFi :

Nous avons déjà mis en ligne deux tutoriels permettant de diffuser du contenu musical de qualité. Nous avions souscrit un contrat deezer premium, et utilisé un ordinateur configuré pour la fonction diffuseur. Les  points d’écoute étaient constitués de chaînes hifi héritées des années 80s, et couplés sur leur entrée aux à un récepteur numérique sur base esp32-lyrat. La jonction entre diffuseur et récepteur(s) s’effectuait en bluetooth ou en wifi.

A présent, nous nous fixons comme objectif de disposer d’une qualité d’écoute hifi, tout en conservant le principe d’une diffusion numérique sur l’ensemble du domicile.

Ce guide a été mis à jour le 29/01/2021. Les modifications seront effectuées au fil du temps pour améliorer le contenu.

Les principes de deezer hifi pour une écoute de qualité  sur ordinateur ou sur smartphone

Avec un contrat deezer premium, tout est fait pour limiter l’usage d’un abonné à la restitution ( sans stockage intermédiaire ) des titres du catalogue sur un smartphone ou sur un ordinateur. L’accès au portail de titres s’effectue avec un navigateur ou un player ( chrome, vlc … ), et le son  est traité au niveau de la carte audio ( ou circuit audio ) du même ordinateur.

Dès lors que l’on passe de deezer premium (9,99€ / mois – sans engagement ) à deezer hifi (14,99€ – sans engagement), le principe commercial reste le même, mais dès lors que l’on dispose d’une configuration de restitution analogique de qualité, et que l’on choisit découter des titres qualifiés du logo hifi, on preçoit tout de suite, sans ambiguité,  l’augmentation de qualité. 

C’est facile à comprendre. Avec deezer premium, les titres du catalogue étaient codés en mp3, et acheminés via réseau en temps réel. La compression mp3 permet une économie de la bande passante réseau. En contrepartie, elle conduit à une dégradation du signal musical clairement perceptible à l’oreille ( lossy encoding ).  Le passage à deezer hifi conduit à un codage de type flac, dont la compression set moindre que celle du mp3, mais qui présente l’avantage de ne pas introduire de dégradation du signal ( lossless encoding ).

En  se fixant comme objectif une qualité d’écoute de niveau HiFi comparable à celle d’un CD, on reste en retrait de ce qu’il est possible d’obtenir avec le niveau Hi-Res, qui est celui des studios d’enregistrement. On pourrait y avoir accès sur la plateforme qobuz, mais avec un catalogue de titres mois étoffé que celui de deezer

Le site  www.cobra.fr, vivement recommandé aux passionés de musique, publie un article efficace sur ce sujet : https://www.cobra.fr/questce-que-laudio-hires-p-43949. Nous en retenons une image fort utile :

Avec le choix d'un abonnement Deezer HiFi, on dispose d'un accès aux titres échantillonnés avec une largeur de 16 bits et un fréquence de 44.1 KHz.

La carte son, carrefour d’orientation du signal numérique pour une écoute locale

Le player (ou le navigateur) de l’ordinateur décode le flux au format flac en temps réel pour le fournir à la carte ( ou circuit ) son en format pcm (Pulse Code Modulation). C’est cette même carte  son qui va pouvoir orienter le signal avec le choix de plusieurs possibilités :

  • soit vers la sortie analogique stéréo, et les enceintes, casque, ou ampli connectés en local via une prise jack  ( couleur verte, symbole écouteurs ) 
  • soit vers la sortie hdmi (numérique), à destination d’un ensemble Home-Cinéma
  • soit vers des enceintes sans-fil ou un équipement de diffusion audio connecté en bluetooth.

Dans le cas présent, l’option bluetooth, déjà traitée dans un tutoriel précédent, n’est pas à même de profiter de la qualité HiFi nouvellement souscrite auprès de deezer.

De même, la restitution sur un Home Cinéma via hdmi introduit un manque de maîtrise au niveau de l’amplification analogique, et un écart par rappport à note objectif HiFi.

Une bonne option de restitution en local consiste à connecter la sortie jack verte stéréo de notre carte son ordinateur à l’entrée aux d’une châine HiFi de qualité.

Jonction entre la carte son du diffuseur et des récepteurs répartis sur le domicile

La solution ffmpeg

On va reconduire l’option de diffuser le flux audio numérique ( repiqué depuis la carte son en format pcm ) vers les récepteurs répartis en différents points d’écoute du domicile.

C’est tooujours le serveur audio http  icecast2, disponible sous debian et Ubuntu, qui rendra le flux numérique accessible aux récepteurs numériques répartis dans le domicile.

Mais par rapport à notre tutoriel précédent, nous ne voulons pas reconduire l’encodage MP3 pour les trames son relayées en local. Nous allons nous inspirer de la stratégie de DEEZER et opter pour un encodage flac ( compression sans perte de signal ). Celà nous écarte de la solution darkice, qui ne propose pas d’options pour encoder sans perte.

Il existe très peu de tutoriels et de manuels sur le sujet, que ce soit au niveau de windows 10 ou de linux. Je choisis d’utiliser ffmpeg, qui dispose d’options de couplage en mode live vers icecast2. Comprenons nous bien, c’est ce dernier point qui pose problème, et fait l’objet de trop peu d’explications sur le site www.ffmpeg.org.

Les options d’encodage ffmpeg mises en oeuvre sur une distribution github assez légère et très peu documentée m’ont fourni une base de départ utile, car adaptée au couplage vers icecast2, et avec un encodage flac.

Documentation et base de départ : 
https://github.com/sumeetkpatel/lossless-icecast-radio
http://icecast.org/download/.
https://www.ffmpeg.org/

Script d'encodage flac-sample.sh :

# Titre : flac-sample.sh
# Auteur : www.philoc.fr
# Date : 30 Janvier 2021
#
# : Streaming audio en mode live, utiilisant ffmpeg.
# : Le flux pcm prélevé depuis la carte son est encodé en flac
# : Le signal encodé est orienté en sortie vers le serveur icecast2, avec un conteneur de type ogg.
#
# OS : linux
# : Utiliser la commande "$ chmod flac-sample.sh +x" pour rendre le fchier exécutable : "$ sh flac-sample.sh".
# : Le mot de passe est celui renseigné dans la configuraton d'icecast2, sous /etc/icecast2/icecast.xml.
# : Les options mises en oeuvres correspondent à une fréquence d'échantillonnage de 96kHz, sous 24 bits.
# : Sous réserve que le serveur icecast2 soit lancé, l'url d'écoute est la suivante : http://localhost:8090/stream.ogg
# : Le nommage du point de montage en "stream" permet dans les cas testés de bénéicier d'un lancement automatique au niveau player/navigateur.

while true
do
/usr/bin/ffmpeg -f alsa -i default -ar 96000 -ac 2 -c:a flac -sample_fmt s32 -compression_level 12 -content_type 'audio/ogg' -ice_name "stream" -ice_description "streamd" "icecast://source:mot-de-passe@localhost:8090/stream.ogg"
sleep 1
done

Configuration icecast2 

Installation :

xxx@debian:/etc$ sudo apt-get install icecast2

Configuration :

La ligne de commande suivante permet de lancer la configuration du service icecast2 (fichier /etc/icecast2/icecast.xml) et de relancer le service.

xxx@debian:/etc$ ps -aux | grep icecast2
icecast2  1331  0.0  0.0 443220  9988 ?        Sl   mars10   1:01 /usr/bin/icecast2 -b -c /etc/icecast2/icecast.xml
xxx 29097  0.0  0.0  12784   968 pts/0    S+   10:56   0:00 grep icecast2

Log sur le terminal de lancement ffmeg

Guessed Channel Layout for Input Stream #0.0 : stereo
Input #0, alsa, from ‘default’:
Duration: N/A, start: 1612002549.154702, bitrate: 1536 kb/s
Stream #0:0: Audio: pcm_s16le, 48000 Hz, stereo, s16, 1536 kb/s
Stream mapping:
Stream #0:0 -> #0:0 (pcm_s16le (native) -> flac (native))
Press [q] to stop, [?] for help
[flac @ 0x55a93f607840] encoding as 24 bits-per-sample
Output #0, ogg, to ‘icecast://source:mot-de-passe@localhost:8090/stream.ogg’:
Metadata:
encoder : Lavf58.20.100
Stream #0:0: Audio: flac, 96000 Hz, stereo, s32 (24 bit), 128 kb/s
Metadata:
encoder : Lavc58.35.100 flac
size= 16148kB time=00:01:06.06 bitrate=2002.4kbits/s speed=0.999x

Configuration et réglage de l’écoute au niveau des récepteurs numériques

Echec de la solution esp32-lyrat à traiter le flux flac

Nous sommes partis de notre réalisation précédente, utilisant une base esp32-lyrat pour le décodage du flux audio http. La modification consistant à remplacer l’option mp3 par l’option flac ne fonctionne pas. On constate sur la console que l’initialisation se passe bien, mais le flux est absent. Il se peut que celà soit lié à une difficulté dans le lancement automatique.

Mise en oeuvre de mini-PC Zotac

Nos récepteurs seront donc des mini-PCs Zotac, configurés en lancement automatique à la mise sous tension, et pilotés depuis le PC diffuseur via ssh. Plutôt que de piloter le navigateur chrome à distance, nous préférons utiliser le player vlc en ligne de commande.

Nous obtenons alors une très bonne qualité découte, sans surprise. Il est tout à fait possible de faire la comparaison en diffusant les deux types de flux ( mp3 et flac ) en simultané, et en basculant d’un flux à l’autre au niveau du récepteur. Je vous promets qu’avec une chaîne hifi de qualité, la différence en qualité sera nettement perceptible.

Fin de l'article. N'hésitez pas à faire part de vos avis et propositions d'améliorations avec les formulaires de www.philoc.fr