多进程环境下PyAudio音频流读取函数无限循环卡顿问题
问题解决:多进程下PyAudio流read卡住的问题
问题原因
PyAudio的音频流是与创建它的进程绑定的资源,主进程中初始化的Recorder对象包含的流,在子进程中无法正常工作——跨进程的资源句柄无法共享,导致stream.read(chunk)陷入阻塞。
解决方案
不在主进程初始化Recorder,而是在子进程内部完成Recorder的初始化,让音频流归属于子进程本身。
修改后的代码示例
class Recorder: (...) def __init__(self): self.p = pyaudio.PyAudio() self.stream = self.p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, output=True, frames_per_buffer=chunk) (...) def listen(self): print('Listening beginning') while True: input = self.stream.read(chunk) rms_val = self.rms(input) if rms_val > Threshold: self.record() (...) import multiprocessing import time def start_listening(): # 子进程内独立初始化Recorder recorder = Recorder() recorder.listen() # 创建并启动子进程 p = multiprocessing.Process(target=start_listening) p.start() # 主进程执行后续逻辑 while True: time.sleep(3) print("hello world")
补充说明
- 子进程启动后会独立运行
listen循环,主进程无需等待,可正常执行自身的循环逻辑。 - 如果需要停止子进程,可调用
p.terminate()方法;若要优雅退出,可给Recorder添加退出标志位,在listen循环中检测标志位退出。
内容的提问来源于stack exchange,提问作者plshelpmeout
相关产品推荐
相关产品推荐

