首页 > 解决方案 > Python多处理pyaudio错误(输入用完)

问题描述

代码:

从多处理导入 Process、Queue、Pipe、freeze_support
从 PyQt5.QtCore 导入 pyqtSignal,QThread
导入pyaudio
从时间导入睡眠

Papinhio_Player_Child_Proc 类(进程):
    
    def __init__(self,to_emitter,process_input_queue):
        超级().__init__()

        self.to_emitter = to_emitter
        self.process_input_queue = process_input_queue
        #QoS设置
        bit_rate = 128*1024 #128 kb/秒
        数据包时间 = 744
        数据包大小 = 4104
        new_sample_rate = 44100

        格式 = pyaudio.paInt16
        频道 = 2

        p = pyaudio.PyAudio()

        #self.stream = p.open(format=pyaudio.paInt16,channels=channels,output=True,input=True,rate=new_sample_rate,frames_per_buffer=packet_size)
        #self.stream.start_stream()

        
    定义运行(自我):
        经过
        '''
        而(真):
            麦克风数据 = self.stream.read(8*int(4104))#744msec
            麦克风切片=音频段(麦克风数据,样本宽度=2,帧速率=44100,通道=1)
            麦克风切片 = AudioSegment.from_mono_audiosegments(麦克风切片,麦克风切片)
            self.stream.write(microphone_slice.raw_data)
            self.to_emitter.send("读取麦克风数据包,并写入输出。")
        '''
            
类 Papinhio_Player_Emitter(QThread):
    a_signal = pyqtSignal(str)

    def __init__(self, from_process: Pipe):
        超级().__init__()
        self.data_from_process = from_process

    定义运行(自我):
        而真:
            尝试:
                数据 = self.data_from_process.recv()
                self.a_signal.emit(数据)
            除了 EOFError 为 e:
                打印(e)
                
def a_signal_handler(self,string_data):
    打印(字符串数据)

如果 __name__ == '__main__':
    冻结支持()
    #papinhio_player_child_process = Papinhio_Player_Child_Proc()
    #papinhio_player_child_process.start()
    papinhio_player_mother_pipe, papinhio_player_child_pipe = Pipe()
    papinhio_player_queue = 队列()
    papinhio_player_emitter = Papinhio_Player_Emitter(papinhio_player_mother_pipe)
    papinhio_player_emitter.start()
    papinhio_player_emitter.a_signal.connect(a_signal_handler)
    

    
    #papinhio_player_queue.put(流)
    papinhio_player_child_process = Papinhio_Player_Child_Proc(papinhio_player_child_pipe, papinhio_player_queue)
    papinhio_player_child_process.start()
    而(真):
        睡觉(1)

up代码问题:无

什么时候出现问题?如果您取消注释这两行:

        #self.stream = p.open(format=pyaudio.paInt16,channels=channels,output=True,input=True,rate=new_sample_rate,frames_per_buffer=packet_size)
        #self.stream.start_stream()

会发生什么问题?

回溯(最近一次通话最后):
  文件“pyaudio_2.py”,第 71 行,在
    papinhio_player_child_process.start()
  文件“C:/msys64/mingw64/lib/python3.8/multiprocessing/process.py”,第 121 行,我
n 开始
    self._popen = self._Popen(self)
  文件“C:/msys64/mingw64/lib/python3.8/multiprocessing/context.py”,第 224 行,我
n _Popen
    返回 _default_context.get_context().Process._Popen(process_obj)
  文件“C:/msys64/mingw64/lib/python3.8/multiprocessing/context.py”,第 327 行,我
n _Popen
    返回 Popen(process_obj)
  文件“C:/msys64/mingw64/lib/python3.8/multiprocessing/popen_spawn_win32.py”,l
ine 93,在__init__
    减少。转储(process_obj,to_child)
  文件“C:/msys64/mingw64/lib/python3.8/multiprocessing/reduction.py”,第 60 行,
在转储
    ForkingPickler(文件,协议).dump(obj)
TypeError:无法腌制“_portaudio.Stream”对象
回溯(最近一次通话最后):
  文件“”,第 1 行,在
  文件“C:/msys64/mingw64/lib/python3.8/multiprocessing/spawn.py”,第 116 行,在
spawn_main
    exitcode = _main(fd, parent_sentinel)
  文件“C:/msys64/mingw64/lib/python3.8/multiprocessing/spawn.py”,第 126 行,在
_主要的
    self = reduction.pickle.load(from_parent)
EOFError:用尽输入

问题:如何在进程中使用 pyaudio 流?

提前致谢, 克里斯·帕帕斯

标签: pythonmultiprocessingpyaudio

解决方案


推荐阅读