PyAudio - 终止时崩溃

时间:2016-08-28 22:44:35

标签: python multithreading anaconda pyaudio

我正在使用pyaudio进行音频播放,但我无法在命令中停止它。 当我让我的播放列表从头到尾播放时它工作得很好但是如果我试图中断播放它会停止但它也会崩溃python并且错误报告说故障模块是_portaudio.pyd。 我正在使用anaconda 2.4.1和python 2.7.11 64位。 这些是控制播放的功能:

    def play_stop(self):
        self.is_playing=self.toggle_flag(self.is_playing)
        t=Create_thread(self.snd_play)
        t.start()

    def snd_play(self):
        global stream
        global p
        self.plist=list()
        p=pyaudio.PyAudio()
        self.ind=self.buffersize-1
        self.currind=1
        for i,f in enumerate(self.file_list[:self.buffersize]):
            self.plist.append(wave.open(f,"rb"))
        while len(self.plist)>0 and self.is_playing:

            if len(self.plist)<self.buffersize:

                self.ind+=1
                try:
                    self.plist.append(wave.open(self.file_list[self.ind],"rb"))
                except IndexError:
                    pass
        self.indexcounter.setText("Zvuk: %d/%d" %(self.currind,len(self.file_list)))
        stream=p.open(format=p.get_format_from_width(self.plist[0].getsampwidth()),
                      channels=self.plist[0].getnchannels(),
                                rate=self.plist[0].getframerate(),
                                output=True)
            data=self.plist[0].readframes(self.plist[0].getnframes())
            stream.write(data)
            stream.stop_stream()
            #stream.close()
            self.plist.pop(0)
            self.currind+=1

            try:
                sleep(abs(float(self.playList.item(self.currind-1,1).text())))
            except TypeError:
                QtGui.QMessageBox.critical(self,u"Greška", "Interval nije cijeli ni decimalni broj")
                break
            except:
                    pass

        else:
            self.is_playing=False
            stream.stop_stream()
            stream.close()
            p.terminate()

python本身在崩溃之前不会抛出任何错误,只有当我尝试停止流,关闭它并在完成播放之前终止pyaudio实例时,它才会崩溃。我用pip安装了pyaudio 正如你所看到的那样,snd_play()方法总是在一个新线程中执行,这就是为什么我在实例化之前切换播放标志的原因,因为我假设所有线程在其功能完成时都会停止

0 个答案:

没有答案