PyAudio 内存错误

3 投票
2 回答
12538 浏览
提问于 2025-04-16 20:44

我在代码中遇到了一个问题,导致内存错误。我觉得这个问题是由下面这个函数引起的。

def sendAudio():
    p = pyaudio.PyAudio()
    stream = p.open(format = FORMAT,
                    channels = CHANNELS,
                    rate = RATE,
                    input = True,
                    output = True,
                    frames_per_buffer = chunk)

    data = stream.read(chunk)
    client(chr(CMD_AUDIO), encrypt_my_audio_message(data))

def keypress(event):
    if event.keysym == 'Escape':
        root.destroy()
    if event.keysym == 'Control_L':
        #print("Sending Data...")
        sendAudio()
        #print("Data Sent!")

这个函数的作用是从麦克风读取数据,然后通过网络发送这些数据。但是每当按下按键时,只要有数据,它就会发送这些数据(这可能是白噪音等)。我想知道有没有办法让它运行得更顺畅一些,我不太确定用按键触发这种情况是否是正确的方法。

谢谢你的回复,我遇到的错误是

Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Python27\lib\threading.py", line 552, in __bootstrap_inner
    self.run()
  File "C:\Python27\lib\threading.py", line 505, in run
    self.__target(*self.__args, **self.__kwargs)
  File "chat.py", line 62, in server
    frames_per_buffer = chunk)
  File "C:\Python27\lib\site-packages\pyaudio.py", line 714, in open
    stream = Stream(self, *args, **kwargs)
  File "C:\Python27\lib\site-packages\pyaudio.py", line 396, in __init__
    self._stream = pa.open(**arguments)
IOError: [Errno Insufficient memory] -9992

2 个回答

3

试着增加一下数据块的大小。对于溢出的问题,你只需要把代码从

data = stream.read(chunk)  

替换成

data = stream.read(chunk, exception_on_overflow = False)  
3

你遇到了什么异常情况?如果是PortAudio的输入溢出,你可以试着增加块大小。另外,当缓冲区因为白噪声而溢出时,可以通过捕获异常并返回一个空的音频流来处理:

try:
    data = stream.read(chunk)
except IOError as ex:
    if ex[1] != pyaudio.paInputOverflowed:
        raise
    data = '\x00' * chunk  # or however you choose to handle it, e.g. return None

撰写回答