python - pyaudio stream.close() menyebabkan program ranap dan pengecualian tidak dapat ditangkap
我想大声告诉你
我想大声告诉你 2017-06-12 09:25:06
0
1
1209

Saya ingin menggunakan pyaudio dengan kerap untuk memainkan audio Walaupun ia bukan modul berbilang benang, ia hanya menggunakan satu sub-utas untuk bermain. Tetapi apabila saya menggunakannya untuk bermain, saya menghadapi masalah yang tidak dapat saya selesaikan.

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)

Keluarannya seperti ini, dan kemudian ia ranap

0                                                #子线程循环第一次
is_active                                        #
not stopped                                      #
True                                             #stream1._is_running
<_portaudio.Stream object at 0x7efd71e00cb0>     #stream1._stream
123                                              #调用stop_stream()之前
456                                              #调用stop_stream()之后,close()之前
[Errno Unanticipated host error] -9999           #子线程捕获到主线程调用stream1.stop_stream()时由stream1.write()抛出的异常IOError,忽略这个异常继续执行
0                                                #子线程stream1.write()抛出异常i+=1未执行继续循环在pa.open()之前的print

1. Dalam erti kata lain, memanggil stream1.close() selepas memanggil stream1.stop_stream() menyebabkan atur cara ranap, dan benang kanak-kanak mahupun utas utama tidak mendapat pengecualian! ! ! !
2 Jika anda mengulas tutup() selepas stop_stream(), tiada masalah untuk masa yang singkat Namun, jika ia terus berjalan selama kira-kira 10 minit, ia tidak akan ranap tetapi tidak akan dapat lagi untuk terus bermain. pa.open() terus membuang pengecualian [Errno Illegal combination of I/O devices] -9993 Apabila saya menutup program dan memulakannya semula, pa.open() akan membuang pengecualian ('Kadar sampel tidak sah', -9997). Untuk main balik Tiada lagi! ! !

Bagaimana untuk menyelesaikan masalah ini?


Gunakan kaedah membuka semula objek pyaudio.Pyaudio() buat sementara waktu setiap kali ia dimainkan, yang menggunakan kira-kira 10ms masa CPU tambahan. Saya menjalankannya secara berterusan selama hampir 20 jam tanpa sebarang masalah.

...
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()
...
我想大声告诉你
我想大声告诉你

membalas semua(1)
阿神

Berikut adalah penyelesaian yang mungkin, hantu mengulas pada 30 Jul 2016

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan