试图理解 PyAudio 错误:[Errno -9981] 输入溢出

Eso*_*ack 8 python audio stream portaudio pyaudio

我正在尝试用 PyAudio 做一个声音处理项目,但有时我会收到这个错误,我不明白为什么。

以下代码播放在我的笔记本电脑麦克风上听到的音频,然后暂停 3 秒钟,然后继续。这段代码运行良好,如果我鼓掌,在暂停期间,暂停结束后音频不会播放,这使得缓冲区填满后任何额外的音频都丢失了。

但是如果我将 CHUNK 减少到 20 这样的低数字,一旦它暂停一秒钟就会抛出错误

  File "C:\Anaconda3\lib\site-packages\pyaudio.py", line 608, in read
    return pa.read_stream(self._stream, num_frames, exception_on_overflow)
OSError: [Errno -9981] Input overflowed
Run Code Online (Sandbox Code Playgroud)

因此,如果音频在暂停期间由于(我认为)缓冲区填满而不会引发错误而丢失,那么当我减少每个缓冲区的帧数时为什么会出现错误?

代码:

import pyaudio
import time

# initialize stream parameters
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 1024

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                output=True,
                frames_per_buffer=CHUNK)


x = 1
while True:
    data = stream.read(CHUNK)
    stream.write(data)

    x=x%100 + 1
    if x == 100:
        print(time.time())
        time.sleep(3)
Run Code Online (Sandbox Code Playgroud)

编辑 - 我想我通过将此参数添加到读取中解决了这个问题:

data = stream.read(CHUNK, exception_on_overflow = False)
Run Code Online (Sandbox Code Playgroud)

但是,我的问题仍然存在。我不明白为什么错误只会发生在较小的 CHUNK 大小时,即使在这两种情况下缓冲区似乎都已填满。