Ich m?chte Pyaudio h?ufig zum Abspielen von Audio verwenden. Obwohl es sich nicht um ein Multithread-Modul handelt, sollte es kein Problem mit der Steuerung des Wiedergabeschalters geben. Aber als ich damit spielte, geriet ich in Schwierigkeiten, die ich nicht l?sen konnte.
import threading
import wave
import pyaudio
import time
pa=pyaudio.PyAudio()
f=wave.open('/home/dyan/catkin_ws/src/hlf_robot/scripts/hlf_voice/my.wav','rb')
raw_data=f.readframes(f.getnframes())
f.close()
samplewidth,channels,framerate,raw_data=2,1,16000,raw_data
i=0
stream1=''
def test():
while True:
global i,pa,stream1
try:
print i
stream1=pa.open(format=pa.get_format_from_width(samplewidth),
channels=channels,
rate=framerate,
output=True)
stream1.write(raw_data)
i+=1
print i
except IOError,e:
print e
except Exception,e:
print e
break
t0=threading.Thread(target=test)
t0.start()
time.sleep(3)
while True:
if stream1.is_active():
print "is_active"
else:
print "not active"
if stream1.is_stopped():
print "is_stopped"
else:
print "not stopped"
print stream1._is_running
print stream1._stream
print '123'
try:
stream1.stop_stream()
print '456'
stream1.close()
except Exception,e:
print e
break
print '789'
time.sleep(3)
Die Ausgabe sieht so aus und dann stürzt es ab
0 #子線程循環(huán)第一次
is_active #
not stopped #
True #stream1._is_running
<_portaudio.Stream object at 0x7efd71e00cb0> #stream1._stream
123 #調(diào)用stop_stream()之前
456 #調(diào)用stop_stream()之后,close()之前
[Errno Unanticipated host error] -9999 #子線程捕獲到主線程調(diào)用stream1.stop_stream()時(shí)由stream1.write()拋出的異常IOError,忽略這個(gè)異常繼續(xù)執(zhí)行
0 #子線程stream1.write()拋出異常i+=1未執(zhí)行繼續(xù)循環(huán)在pa.open()之前的print
1. Mit anderen Worten: Der Aufruf von stream1.close() nach dem Aufruf von stream1.stop_stream() führte zum Absturz des Programms und weder der untergeordnete Thread noch der Hauptthread haben die Ausnahme abgefangen! ! ! !
2. Wenn Sie close() nach stop_stream() auskommentieren, gibt es für kurze Zeit kein Problem. Wenn es jedoch etwa 10 Minuten lang weiterl?uft, stürzt es nicht mehr ab weiterspielen. pa.open() l?st weiterhin eine Ausnahme aus [Fehler: Ungültige Kombination von E/A-Ger?ten] -9993 Wenn ich das Programm schlie?e und neu starte, l?st pa.open() eine Ausnahme aus (?Ungültige Abtastrate“, -9997). . Zur Wiedergabe Nicht mehr! ! !
Wie kann dieses Problem gel?st werden?
Derzeit besteht die L?sung darin, ein pyaudio.Pyaudio()-Objekt bei jeder Wiedergabe erneut zu ?ffnen, was etwa 10 ms zus?tzliche CPU-Zeit verbraucht. Ich habe es fast 20 Stunden lang ohne Probleme laufen lassen.
...
try:
self.pa=pyaudio.PyAudio()
self.stream=self.pa.open(format=self.pa.get_format_from_width(samplewidth),
channels=channels,
rate=framerate,
output=True)
self.stream.write(raw_data)
except IOError,e:
pass
finally:
self.stream.close()
self.pa.terminate()
...