python - pyaudio stream.close()導(dǎo)致程序崩潰且不能捕獲到異常
問題描述
我想要頻繁地使用pyaudio來播放音頻,雖然他不是多線程模塊,但是只使用一個子線程播放,主線程控制播放的開關(guān)應(yīng)該是沒有問題的。但是當(dāng)我使用它播放時遇到了不能解決的麻煩。
import threadingimport waveimport pyaudioimport timepa=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_datai=0stream1=’’def test(): while True:global i,pa,stream1try: 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 iexcept IOError,e:print eexcept Exception,e:print ebreakt0=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 ebreak print ’789’ time.sleep(3)
輸出是這樣的,然后崩了
0#子線程循環(huán)第一次is_active#not stopped #True #stream1._is_running<_portaudio.Stream object at 0x7efd71e00cb0> #stream1._stream123 #調(diào)用stop_stream()之前456 #調(diào)用stop_stream()之后,close()之前[Errno Unanticipated host error] -9999 #子線程捕獲到主線程調(diào)用stream1.stop_stream()時由stream1.write()拋出的異常IOError,忽略這個異常繼續(xù)執(zhí)行0#子線程stream1.write()拋出異常i+=1未執(zhí)行繼續(xù)循環(huán)在pa.open()之前的print
1、也就是說在調(diào)用stream1.stop_stream()后調(diào)用stream1.close()導(dǎo)致程序崩潰了,而且子線程和主線程都沒有捕獲到異常!!!!2、如果將stop_stream()后的close()注釋掉短時間內(nèi)沒有任何問題,但是持續(xù)運行大約10分鐘左右雖然不會崩潰但是再也不能繼續(xù)播放。pa.open()一直拋出異常[Errno Illegal combination of I/O devices] -9993,當(dāng)我關(guān)閉程序重啟時pa.open()會拋出異常(’Invalid sample rate’, -9997),播放用不了了!!!
這個問題該如何解決?
暫時使用每次播放均重開一個pyaudio.Pyaudio()對象的方式解決,這大概額外使用了cpu時間10ms。持續(xù)跑了將近20個小時沒出問題。
...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: passfinally: self.stream.close() self.pa.terminate()...
問題解答
回答1:這裡給了一個可能解決方法(workaround),ghost commented on 30 Jul 2016
相關(guān)文章:
1. 基于Spring MVC Java的配置無法正常工作控制臺顯示無錯誤,但我的jsp頁面未顯示2. java - mac下配置ndk環(huán)境變量3. 為啥最大化個窗口還得找一堆理由?4. css - psd設(shè)計稿給的是1920寬的,而我的電腦是1600寬的,那我在寫代碼時,是不是每個寬度都要計算調(diào)整5. javascript - Angular2中聲明的成員變量為何顯示undefined?6. java - new + 類名,一定需要申明一個對象嗎?7. HTML表單操作標(biāo)簽調(diào)用父相對URL8. javascript - 根據(jù)不同數(shù)據(jù)顯示不同內(nèi)容9. css3 - 如圖的flex骰子布局是怎么實現(xiàn)的?10. android - 京東app下面的table背景怎么實現(xiàn)的?
