J'écris un simple frontend en Python pour jouer et enregistrer des canaux de radio internet (par exemple de shoutcast) en utilisant mplayer (dans un sous-processus). Lorsqu'un utilisateur clique sur une station le code suivant est exécuté:Python: Parse stream title avec mplayer
url = http://77.111.88.131:8010 # only an example
cmd = "mplayer %s" % url
p = subprocess.Popen(cmd.split(), shell=False)
wait = os.waitpid(p.pid, 1)
return int(p.pid)
Cela fonctionne parfaitement, le courant commence à jouer comme il se doit. Bien que je voudrais en quelque sorte analyser le titre du flux. Il semble que j'ai besoin de récupérer le titre de la sortie mplayer. Ceci est la sortie lorsque je joue le flux dans un terminal:
$ mplayer http://77.111.88.131:8010 MPlayer 1.0rc4-4.4.5 (C) 2000-2010 MPlayer Team mplayer: could not connect to socket mplayer: No such file or directory Failed to open LIRC support. You will not be able to use your remote control. Playing http://77.111.88.131:8010. Resolving 77.111.88.131 for AF_INET6... Couldn't resolve name for AF_INET6: 77.111.88.131 Connecting to server 77.111.88.131[77.111.88.131]: 8010... Name : Justmusic.Fm Genre : House Website: http://www.justmusic.fm Public : yes Bitrate: 192kbit/s Cache size set to 320 KBytes Cache fill: 0.00% (0 bytes) ICY Info: StreamTitle='(JustMusic.FM) Basement - Zajac, Migren live at Justmusic 2010-10-09';StreamUrl='http://www.justmusic.fm'; Cache fill: 17.50% (57344 bytes) Audio only file format detected.
Il s'exécute ensuite jusqu'à ce qu'il soit arrêté. Donc la question est, comment puis-je récupérer "(JustMusic.FM) Sous-sol - Zajac, Migren en direct à Justmusic 2010-10-09" et encore laisser le processus s'exécuter? Je ne pense pas que subprocess() stocke réellement la sortie, mais je pourrais me tromper. Toute aide est très apprécié :)
Merci beaucoup! Bien que stdout = PIPE, stderr = STDOUT bloque totalement l'interface graphique de TK. Si je "casse" la boucle, mplayer s'arrête après environ 30 secondes. De toute façon autour de cela? Peut-être échapper à la boucle sans affecter le processus? – frigg
Essayez d'abord avec 'p.communicate()'. Il semble qu'un tampon se remplisse et ne soit pas lu à temps pour une raison quelconque, ce qui empêche le processus de bloquer. Vous n'avez pas besoin de 'stdout' * et *' stderr'; sans doute le message que vous voulez ne sort que sur un de ceux-là, je ne sais pas lequel! Peut-être stderr, auquel cas essayez simplement 'stderr = PIPE'? – bobince