设置PyAudio流输入和输出为真时出现IOError: [Errno Input overflowed] -9981

10 投票
2 回答
5566 浏览
提问于 2025-04-17 08:39

我在我的Mac(OS 10.7.2)上尝试运行以下代码(这是PyAudio文档中的一个示例):

import pyaudio
import sys

chunk = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 5

p = pyaudio.PyAudio()

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

print "* recording"
for i in range(0, 44100 / chunk * RECORD_SECONDS):
    data = stream.read(chunk)
    stream.write(data, chunk)
print "* done"

stream.stop_stream()
stream.close()
p.terminate()

我遇到的错误是:

Traceback (most recent call last):
  File "PyAudioExample.py", line 24, in <module>
data = stream.read(chunk)
  File "/Library/Python/2.7/site-packages/pyaudio.py", line 564, in read
return pa.read_stream(self._stream, num_frames)
IOError: [Errno Input overflowed] -9981

我在谷歌上搜索了这个错误,发现调整块的大小可能会有所帮助,试着把它调大或调小。我试过了,但没有任何变化。我还尝试添加以下代码来捕捉过载异常:

try:
    data = stream.read(chunk)
except IOError as ex:
    if ex[1] != pyaudio.paInputOverflowed:
        raise
    data = '\x00' * chunk

这样避免了错误,但我没有听到我的输入音频,而是听到了一堆刺耳的点击声。

为了排查问题,我把output=True这一行注释掉了,程序运行正常,但什么也没有输出。我把input=True注释掉,改为读取一个Wave文件,这样流就能输出音频。我还尝试创建两个流,一个用于输入,一个用于输出,但也没有成功。

还有什么其他方法可以避免这个错误吗?

2 个回答

0

之前在portaudio这个软件里有个问题,导致在OS X系统上出现很多莫名其妙的溢出错误(你可以查看这个链接了解更多:http://music.columbia.edu/pipermail/portaudio/2012-June/014167.html)。

我确认了截至2012年8月6日的portaudio每日更新版本已经修复了这个问题。

1

我在手动安装pyaudio的时候遇到了同样的问题(是从源代码编译portaudio)。有一个不是特别完美的解决办法,就是去下载适用于苹果Mac OS X(通用版)的pyaudio,安装它,这样只会为Python 2.6及之前的版本安装。如果你用/usr/bin/python2.6来运行你的代码,那就没问题了。但如果你真的想用2.7版本的话,可以把安装好的模块(pyaudio.py和_portaudio.so)复制到2.7的文件夹/Library/Python/2.7/site-packages/里。

我不知道为什么从源代码编译这个模块会不成功。

撰写回答