[RÉSOLU] [Python] Demande audio qui fait planter le code que sous un RPi

Salut, dans un autre post je parlais de mon petit code pour mon projet de Deskboard. J’arrive a créer ce que je veux, mais c’est une fois sous Raspbian du Raspberry Pi que tout lâche.

J’utilise 3 appareils pour tester mon code; mon Pc sous WIn10, un eeePC avec Raspbian OS X86 (Raspbian du RPi, mais pour les PC) et un PiZero avec Raspbian OS Full.

Je code sous mon Windows 10, même éditeur sur les 3 (Thonny) et en version Python 3, je tente d’installer les même package sur chaque.

  • Sous Windows 10 pas de soucis, tout comme sous le eeePC, je clique « play » et la radio démarre,
  • Sous le RPi0, l’application démarre, je click sur « play », il a un délais, pas de son, et il « gèle » (un scrolling text de mon code arrête, ce qui me dit que le code a stoppé, l’actualisation en background est également stoppé) pas de message d’erreur, pas d’indication qu’un module est requis.

Dans mes premiers tests, j’avais dans le /boot/config.txt l’audio module désactivé (passant que sur le BT), j’ai réactivé en passant que le passage ne marche pas avec Python, mais aucune différence.

Voici mon code;

Le « import » complet

import json, requests, gi, re, datetime
gi.require_version("Gtk", "3.0")
gi.require_version('Gst', '1.0')
from gi.repository import Gtk
from gi.repository import GLib
from gi.repository import GObject
from gi.repository import Gst
from gi.repository.GdkPixbuf import Pixbuf

Le « init »

Gst.init_check(None)
self.IS_GST010 = Gst.version()[0] == 0
self.player = Gst.ElementFactory.make("playbin", "player")
self.player.set_property("uri", "http://radio.levelkro.net:8000/1")
self.bus = self.player.get_bus()
self.bus.add_signal_watch()
self.bus.connect("message", self.on_message)
self.player.connect("about-to-finish",  self.on_finished) 

Les 2 commandes linké

# Music Player
def triggerPlayer(self, w):
    if self.statePlayer == False:
        self.statePlayer = True;
        self.buttonPlayerAction.get_child().set_from_file("stop.png")
        self.player.set_property("uri", "http://radio.levelkro.net:8000/1;.mp3")
        self.player.set_state(Gst.State.PLAYING)
        GLib.timeout_add_seconds(1, self.setPlayerUpdates)
    else:
        self.player.set_state(Gst.State.NULL)
        self.statePlayer = False;
        self.buttonPlayerAction.get_child().set_from_file("play.png")
    
def setPlayerUpdates(self):
    if(self.statePlayer == False):
        return False
   
    posTimeNano = self.player.query_position(Gst.Format.TIME)[1];
    posTimeSec = float(posTimeNano / Gst.SECOND)
    self.dataPlayerTime.set_text(str(datetime.timedelta(seconds=round(posTimeSec))))
    return True

def on_message(self, bus, message):
    t = message.type
    if t == Gst.MessageType.EOS:
        self.player.set_state(Gst.State.NULL)
        self.statePlayer = False;
        self.buttonPlayerAction.get_child().set_from_file("play.png")
    elif t == Gst.MessageType.ERROR:
        self.player.set_state(Gst.State.NULL)
        err, debug = message.parse_error()
        print("Error: %s" % err, debug)
        self.statePlayer = False;
        self.buttonPlayerAction.get_child().set_from_file("play.png")

Dans quel situation que la lecture peux causer un plantage ? Problème avec les RPi0 ? Besoin de la clé de licence de décodage Mpeg ?

Une partie du problème réglé; la licence MPG2 est vraiment la solution pour régler le « freeze », mais j’ai pas de son. Je sort via le BT, et c’est la seule sortie possible, le hdmi est absent, delisté. Mais je vais voir sous mon Raspbian lite si il as le même problème.


Edit: Après quelques recherches j’ai testé la sortie avec cette commandes depuis le terminal du bureau;

gst-launch-1.0 playbin uri=http://radio.levelkro.net:8000/1

Aucun son mais il travail. Après quelques lectures de forum anglo, je tombe sur un utilisateur RPi3 avec le même problème, et j’ai ainsi trouvé la solution à ce problème, la présence d’une mauvaise librairie et d’un cache. Pour régler il suffit de faire;

sudo rm /usr/lib/arm-linux-gnueabihf/gstreamer-1.0/libgstomx.so
sudo rm ~/.cache/gstreamer-1.0/registry.arm.bin

Et de relancer la demande de lecture. Testé avec mon application également, et ça règle enfin ce dossier.

Bon, le problème n’est pas réglé, bien en fait la solution ne semble pas s’appliquer avec un Raspbian Lite.

La lecture dois bien démarrer, le timer avance, mais aucun son. Sortie unique via BT (HDMI désactivé et non utilisé)

Après quelques essais et backup et re-imager ma carte SD, j’arrive à ceci;

  • L’application peu lire, le problème n’est pas au niveau du « routage » du signal sonore,
  • La musique arrête, repart, et le timer continue sans broncher,
  • Avec « gst-launch » j’ai eu plus de réponse; le lecteur ne semble pas en mesure de gérer un tampon (buffer), il indique « tampon plein » dans les moment ou il y a aucun son, j’ai parfois un départ et une lecture continue propre sans ce message.

Dans l’application que je me suis créé, j’ai bien sur aucun message, à la fermeture des tests avec « gst-launch » j’ai vu le timer, bref, ce n’est pas vraiment « la lecture » ce timer mais un « depuis quand je suis actif sur la tâche audio », alors le timer monte même si la radio est arrêté en raison d’un buffer ou autre.

Alors je vais fouiller voir si je peux améliorer le buffer et la réaction, et voir si avec « nice » je peux aider l’application à rouler.


edit 26-04-2021
Lancer le script avec « nice » aide grandement, mais ça ne règle pas le problème, il a des perte du son à des moments étranges. Un stop/play de la lecture manuelle semble régler le problème la plupart du temps.

Je tentes des essais avec « libvlc » et ça me semble pas mal plus performant, il faut que tester avec le temps maintenant.


GSTreamer est vraiment faiblare comparé au VLC, aucun problème à date, la musique coupe jamais. Problème réglé :slight_smile: