我正在编写一个程序,只要麦克风检测到的振幅超过一定水平,就应该播放wav文件。我想使用pyaudio(过去在某种程度上已经成功),因为我需要同时处理2个流。现在问题出现在何时
我想在独立于主线程的进程中播放wav文件。以下代码只是概念证明:
import pyaudio,wave
import multiprocessing,time
filename='/home/larfan/Documents/PythonProgramming/overtone_horn/soundsamples/ZOOM0065.WAV'
#open soundfile
wf = wave.open(filename, 'rb')
chunk = 1024*4
p = pyaudio.PyAudio()
class output:
def __init__(self):
self.stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),
channels = wf.getnchannels(),
rate = wf.getframerate(),
output = True)
# Read data in chunks
self.origdata = wf.readframes(chunk)
def actualoutput(self):
data=self.origdata
# Play the sound by writing the audio data to the stream
while data:
self.stream.write(data)
data = wf.readframes(chunk)
def testfuntion(self):
print('hi')
out=output()
t1=multiprocessing.Process(target=out.actualoutput)
t1.start()
time.sleep(2)
out.stream.close()
t1.terminate()
p.terminate()
如果我运行此代码,我会得到:
Traceback (most recent call last):
File "/usr/lib/python3.7/multiprocessing/process.py", line 297, in _bootstrap
self.run()
File "/usr/lib/python3.7/multiprocessing/process.py", line 99, in run
self._target(*self._args, **self._kwargs)
File "/home/larfan/Documents/PythonProgramming/overtone_horn/ultimatetest.py", line 23, in actualoutput
self.stream.write(data)
File "/usr/lib/python3/dist-packages/pyaudio.py", line 586, in write
exception_on_underflow)
OSError: [Errno -9999] Unanticipated host error
当我调用.actualoutput()时,如果完全可以工作,并且如果我使用run()而不是start()进行多处理,那么它也可以工作。但是,我不能使用run(),因为我希望主线程继续运行,并且希望使用上面代码中的terminate()选项。在实际程序中,我显然希望在振幅下降到阈值以下时调用terminate(),而不是在固定的秒数之后
有没有人知道如何使这项工作。即使只是对解决方案的一个暗示也将非常感激。 问候
如果您只想将文件与主程序分开播放,asyncio的
run_in_executor()
可能是最好的方式。当有多个线程并且需要同时启动它们并收集结果时,最好使用多处理例如:
现在您可以根据需要运行调用此函数,它将始终单独运行到主程序,而不会将其置于等待状态:
产生以下输出:
相关问题 更多 >
编程相关推荐