Ich versuche, einen Radio-Player mit RPi zu implementieren. Das Ziel besteht darin, eine Wiedergabeliste einzurichten und mit der Wiedergabe zu beginnen, sobald die Wiedergabeliste ausgefüllt ist. Die Player- und Radio-Prozesse werden voraussichtlich beendet, sobald der Stop-Code ausgeführt wird.Python Subprozess Popen.terminate() immer noch auf warten()
Der Radio-Prozess beendet schön, aber der Player-Prozess bleibt immer noch auf warten, auch nach dem Beenden zu beenden. Wenn der Stop-Code erneut aufgerufen wird dann Spieler Prozess beendet
Dinge versucht:
- Neuordnungs Befehle warten (Spieler, Radio)/(Radio, Spieler)
- ähnlich Befehle beenden Neuordnungs
- kill statt beenden hängt RPI
Spieler Code:
while playlist:
player = subprocess.Popen(
["avconv", "-i", "Music/%s" % playlist[0], "-f", "s16le", "-ar",
"22.05k", "-ac", "1", "-"], stdout=subprocess.PIPE)
radio = subprocess.Popen(["./pifm", "-", freq], stdin=player.stdout)
radio.wait()
print "************ exiting from radio :)"
player.wait()
print "************ exiting from player :)"
playlist.pop(0)
player = None
radio = None
Spieler Stop-Code (von einem anderen Thread genannt):
print "************ stop requested"
if radio and radio.poll() is None:
print "************ terminating radio :)"
radio.terminate()
if player and player.poll() is None:
print "************ terminating player :)"
player.terminate()
Alternative:
Eine weitere Alternative für Spieler
def start_radio():
global radio
radio = subprocess.Popen(["./pifm"...], stdin=subprocess.PIPE)
def play():
global player
while playlist and radio:
player = subprocess.Popen(["avconv"...], stdout=radio.stdin)
player.wait()
playlist.pop(0)
def stop():
if player and player.poll() is None:
print "************ terminating player :)"
player.terminate()
eine persistente Senke für Radio und auf Anfrage Prozess zu haben war
Aber in diesem Fall schließt der Aufruf von player.terminate() den Player, während das letzte Paket wiederholt im Radio-Prozess abgespielt wird (wie ein festsitzender Datensatz). . Dieser steckengebliebene Rekord spielt, bis ich einen neuen Spieler starte oder das Radio beende.
Versuch 'player.join()' 'dann Spieler. terminate() '? – ritlew
@ritlew 'player' ist Popen-Objekt und hat keine Join-Methode. – CuriousCat
1- * "mit kill anstelle von terminate hängt das RPi" * - Sie sollten dieses Problem zuerst beheben (es könnte Ihnen auch ermöglichen, die aktuelle Frage zu beantworten). 2- Sie sollten 'player.stdout.close()' nach 'radio = Popen (...)' aufrufen, damit der Player-Prozess beendet wird, wenn der Radio-Prozess beendet wird. – jfs