La machine à bandes-annonces v3

Dolby Machin, DTS Truc

En préambule, parlons un peu des systèmes de son présents sur nos dvd et blu-ray. En dvd, les plus répandus sont Dolby Digital et DTS (jusqu’à 5.1 canaux). A l’époque on manquait de place sur les supports physiques et donc ce sont des protocoles qui compressent le son et occasionnent par là, une perte de qualité.

Avec le blu-ray, plus de problème de place. On peut donc passer à des formats de son plus gros et donc sans perte de qualité, appelés généralement « lossless ». C’est le Dolby TrueHD et encore plus répandu : les DTS-HD MA (Master Audio). Ces flux nécessitent quand même un décodage et donc du hardware ou du logiciel pour faire ce taf.

Le Passthrough

Le mode passthrough est généralement présent sur toutes les sources (lecteurs blu-ray, lecteurs multimédia, etc.). Cela signifie que la source envoie à l’ampli un flux numérique direct (du bitstream) non décodé et que l’ampli doit alors décoder.

Généralement, on utilise le passthrough quand on dispose d’un ampli « home cinéma ». Même les entrées de gamme ont maintenant le décodage intégré du Dolby TrueHD et DTSHD-MA.

Le Raspberry Pi 3 et le son HD

Je trouve bizarre que l’on ne trouve pas d’informations claires à ce sujet. J’ai parcouru pas mal de forums et souvent les gens confondent un peu tout, on entend tout et son contraire.

Le truc le plus juste et le plus argumenté que j’ai trouvé, c’est la prose de M. Noggin ici : https://forum.kodi.tv/showthread.php?tid=309301

Il dit en gros que le Pi 3 est limité par la bande passante de son port HDMI. Ceci ne permet pas le passage des flux DTS HD ou Dolby True HD. Par contre, il est possible de faire décoder le DTSHD sur le Pi et d’envoyer un flux LPCM (c’est du son direct) multi-canal.

A quelques exceptions près, puisque certaines pistes DTSHD peuvent utiliser un échantillonnage encore plus gourmand mais c’est très minoritaire et réservé aux audiophiles fous.

Autre exception : le Dolby Atmos et DTS:X, les dernières inventions des ingénieurs son. Celles-ci sont pour moi, un peu gadgets et réservés aux très gros films hollywoodiens uniquement.

Ce n’est pas très logique car à priori, il est plus facile d’envoyer un flux non décodé qu’un flux décodé. Mais sur le Pi c’est visiblement dû au port HDMI. C’est ce qui occasionne beaucoup de confusions.

J’ai fait des tests et pour moi tout cela est bien confirmé. J’ai utilisé l’OS LibreElec 9.2.4 contenant Kodi 18 (nom de code Leia) sur un Raspberry Pi 3. Kodi est une solution logicielle pour gérer et jouer ses vidéos et musiques.

Est-ce que le Raspi 3 + Kodi peuvent-ils envoyer du DTSHD et Dolby TrueHD en passthrough ?

La réponse est non. Quand on joue un fichier DTSHD, l’ampli détecte en sortie du Pi une piste DTS « simple ». C’est pas super grave mais il est fort probable qu’on ait une perte quelque part. Idem pour le Dolby TrueHD, on se retrouve dans l’ampli avec une piste Dolby Digital simple.

Cela est confirmé par la page de configuration de Kodi qui ne contient pas les lignes « Votre ampli est capable de recevoir du DTS HD  / Dolby True HD » :

Pour profiter d’une piste DTSHD ou DolbyTrueHD, il faut désactiver le passthrough et préciser le nombre de canaux dont on dispose sur l’ampli (5.1 dans mon cas). Ainsi on aura une piste LPCM en sortie du Hdmi du Pi. Bien sûr, il faut aussi régler l’ampli pour recevoir ce type de piste (c’est pas forcément détecté automatiquement parce que le signal n’est plus numérique). Sur le mien, ça s’appelle MultiCh (multi-channel). Et l’on voit pour chaque piste, les canaux utilisés.

Est-ce que le Raspi 4 peut-il envoyer du DTSHD en passthrough ?

En juillet 2019, c’était non mais le matos serait capable. Il faut donc attendre que LibreElec l’intègre. Cependant, il semble y a voir eu des nouvelles récemment (juillet 2020) avec une version « pré-alpha » expérimentale disponible :

https://forum.libreelec.tv/thread/22302-rpi4-testbuild-with-hd-audio-passtrhough-atmos-etc/

Une image très récente (20/08/2020) pourrait donc bien fonctionner :

https://test.libreelec.tv/

par exemple :

[ ] LibreELEC-RPi4.arm-9.80-nightly-20200816-6063236.img.gz

On se retrouve donc avec un Kodi 19 (nom de code Matrix) qui contient bien cette fois-ci les paramétrages :

Et même que ça fonctionne !! Par contre, c’est une version de test, donc l’auteur ne garantit pas que les add-ons et tout le reste va fonctionner « normalement ».

La machine à bandes-annonces Deluxe Edition

Sur la précédente machine à bandes-annonces, j’utilisais du vieux matériel pas très puissant, et une vieille distribution Linux (Jessie).

J’aimerais donc refaire la même chose mais avec LibreElec + Kodi sur un Raspberry Pi 3. Pour mémoire, il s’agissait de jouer des vidéos automatiquement dès le démarrage et dans un ordre aléatoire. Les vidéos étant présentes sur une clé USB.

Se connecter en ssh au Pi : root / libreelec (attention, ya deux « e »)

Pour lancer quelque chose au démarrage, Kodi impose de passer par un script python nommé autoexec.py à placer dans un répertoire spécial. Ce répertoire dépend du système utilisé (https://kodi.wiki/view/Userdata)

Mais pour libre Elec sur Raspberry, c’est donc dans /storage/.kodi/userdata/

Pour faire un premier test, je vais faire un truc tout simple : afficher la fenêtre des infos système.

import xbmc
xbmc.executebuiltin('ActivateWindow(systeminfo)')

On reboote et sauf erreur de syntaxe, ça doit fonctionner !

Pour faire des expérimentations, on peut utiliser la ligne de commande kodi-send, pour voir si la syntaxe est bonne. Par exemple, pour jouer une playlist :

kodi-send --action="PlayMedia(/storage/.kodi/userdata/toto.m3u)"

On va compliquer les choses et générer une liste « désordonnée » des fichiers présents sur la clé USB pour la mettre dans une playlist.

Si Libreelec est basé sur du Linux, cette distribution est épurée et ne contient pas toutes les commandes habituellement présentes. C’est notamment le cas de toutes les fonctions pouvant générer du « hasard ». Ça ne m’arrange pas mais j’ai trouvé un truc sur le net avec « awk » :

import os,xbmc
os.system("ls -d /media/USB\ DISK/*.m* > /storage/.kodi/userdata/toto.m3u")
os.system("cat /storage/.kodi/userdata/toto.m3u | awk 'BEGIN{srand();}{print rand()\"\t\"$0}' | sort -k1 -n | cut -f2 > /storage/.kodi/userdata/traile
xbmc.executebuiltin('PlayMedia(/storage/.kodi/userdata/trailers.m3u)')

Dans mon cas, j’ai réuni assez de bandes-annonces (sur une clé de 128 Go) pour que ça tourne plusieurs heures. Mais si on veut jouer la playlist en boucle, on pourrait ajouter à la fin :

xbmc.executebuiltin( "PlayerControl(repeat)" )

Mais j’ai remarqué que ça bugge de temps en temps et que seul le premier titre de la liste est en « repeat » !

Attention aussi aux noms des fichiers, certains accents ou caractères en langue étrangère peuvent poser problème.

J’ai rencontré à peu près les mêmes soucis que sur mon Raspberry Pi 2 + Jessie. Si l’ampli est allumé après le Pi, le signal n’est pas détecté sur le hdmi (écran noir, pas de son).

Il faut éditer le fichier /flash/config.txt pour y faire quelques réglages. Problème : dans le cas de LibreElec ces fichiers sont en lecture seule. On remonte donc temporairement ce répertoire en « read write » :

mount -o remount,rw /flash

Editer le fichier /flash/config.txt (attention, hdmi_mode et hdmi_group vont de pair) pour forcer le signal hdmi en 1080p.

hdmi_force_hotplug=1
hdmi_mode=16
hdmi_group=1

Remettre le système comme c’était avant :

mount -o remount,ro /flash

Il ne faut pas oublier de tuner un peu Kodi :

  • désactiver le passthrough (si on veut du DTSHD ou Dolby TrueHD!)
  • définir le nombre de canaux.

Masquer le GUI / OSD

A chaque changement de vidéo, pendant une seconde, on voit le GUI qui apparaît. C’est le menu avec le titre de la vidéo, les icones stop / pause / avance rapide / chapitre suivant, etc.

Pour masquer ça, c’est un peu compliqué car ces paramètres dépendent du « skin » utilisé. Dans Kodi 18, le skin par défaut s’appelle Estuary et c’est un « skin » système donc non modifiable.

On commence d’abord par faire une copie « utilisateur » dans un add-on :

cp -R /usr/share/kodi/addons/skin.estuary /storage/.kodi/addons/skin.toto

Dans la racine de skin.toto, se trouve le fichier addon.xml qu’il faut modifier :

<addon id="skin.estuary" version="1.9.16" name="Estuary" provider-name="phil65, Ichabod Fletchman"> 

devient :

<addon id="skin.toto" version="1.0" name="Estuary-mod" provider-name="Carl A. Rotwang">

Ensuite, dans le répertoire de l’add-on, j’ai modifié le fichier xml/DialogSeekBar.xml en supprimant toutes les lignes commençant par <visible>.

Pour finir, il ne faut pas oublier d’activer l’add-on dans Kodi et de changer de skin. Un coup de reboot et ça doit fonctionner.

Si on bouge la souris, on n’a plus le titre et l’heure mais il reste tout de même le menu de navigation en bas. Mais en tout cas, ça n’apparaît plus au lancement d’une vidéo.

Update 29/01/2022 :

Le script de mélangeage des fichiers ne marche pas trop bien. On se retrouve souvent avec la même liste dans le même ordre. J’ai donc amélioré les choses en utilisant la bibliothèque random de Python (je ne sais pas pourquoi j’avais dit que ce n’était pas dispo mais ça l’est…) :

import random, csv, os, xbmc
os.system("ls -d /media/USB\ DISK/*.m*  > /storage/.kodi/userdata/all.m3u")
os.system("ls -d /media/USB\ DISK/demo/*.m*  > /storage/.kodi/userdata/demo.m3u")
os.system("ls -t /media/USB\ DISK/*.m* | head -n 15 > /storage/.kodi/userdata/recent.m3u")

with open("/storage/.kodi/userdata/all.m3u") as file:
    list_all = [line.rstrip() for line in file]

with open("/storage/.kodi/userdata/demo.m3u") as file:
    list_demo = [line.rstrip() for line in file]

with open("/storage/.kodi/userdata/recent.m3u") as file:
    list_recent = [line.rstrip() for line in file]

random.shuffle(list_all)
random.shuffle(list_demo)
random.shuffle(list_recent)

fichier = open("/storage/.kodi/userdata/trailers.m3u", "w")
fichier.write(list_demo[0]+"\n")
fichier.write(list_recent[0]+"\n")
fichier.write(list_recent[1]+"\n")

for element in list_all:
    fichier.write(element+"\n")

fichier.close()

xbmc.executebuiltin('PlayMedia(/storage/.kodi/userdata/trailers.m3u)')

Laisser un commentaire