使用pyaudio中除rate/format/chunk之外的其他数值时,会出现错误:[Errno Input overflowed] -9981。

4

操作系统:Mac OSX 10.7.5

Python版本:Python 2.7.3(homebrew)

pyaudio版本:0.2.7

portaudio版本:19.20111121(homebrew-portaudio)

以下脚本输出以下内容并显示我遇到的问题:

#!/usr/bin/env python
import pyaudio
from pprint import pprint

p = pyaudio.PyAudio()


# SUCCEEDS
pprint(p.is_format_supported(input_format=pyaudio.paInt8,input_channels=1,rate=44100,input_device=0)) # => True
try:
    stream = p.open(format=pyaudio.paInt8,channels=1,rate=44100,input=True,frames_per_buffer=1024)
    data = stream.read(1024)
except IOError as e:
    print 'This never happens: '+str(e)

# FAILS
pprint(p.is_format_supported(input_format=pyaudio.paInt8,input_channels=1,rate=22050,input_device=0)) # => True
try:
    stream = p.open(format=pyaudio.paInt8,channels=1,rate=22050,input=True,frames_per_buffer=1024)
    data = stream.read(1024)
except IOError as e:
    print 'This fails: '+str(e)

# FAILS
pprint(p.is_format_supported(input_format=pyaudio.paInt8,input_channels=1,rate=22050,input_device=0)) # => True
try:
    stream = p.open(format=pyaudio.paInt8,channels=1,rate=22050,input=True,frames_per_buffer=512)
    data = stream.read(1024)
except IOError as e:
    print 'This also fails: '+str(e)

# FAILS
pprint(p.is_format_supported(input_format=pyaudio.paInt8,input_channels=1,rate=11025,input_device=0)) # => True
try:
    stream = p.open(format=pyaudio.paInt8,channels=1,rate=11025,input=True,frames_per_buffer=512)
    data = stream.read(1024)
except IOError as e:
    print 'This also fails as well: '+str(e)

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

上述代码会输出以下内容:
True
True
This fails: [Errno Input overflowed] -9981
True
This also fails: [Errno Input overflowed] -9981
True
This also fails as well: [Errno Input overflowed] -9981

就我个人而言,在我的Mac(10.8.3)上使用Apple Python 2.7.2,Homebrew 2.7.3和python.org 3.3.0(相同的portaudio/pyaudio版本)进行测试时,即使所有后续调用都使用与第一个调用相同的格式,它始终在第二个及以后的所有调用中100%地给出相同的错误。因此,我怀疑问题根本不在于格式。 - abarnert
我的怀疑是你在创建新的流之前没有调用每个流的stop_streamclose,这意味着你正在泄漏某些东西,阻止未来的流正常工作。但是,从一个快速测试来看,即使有了这个修复,我似乎仍然会得到相同的错误。(当然,你应该做出这个修复。) - abarnert
2个回答

7

如果您想检查所需的格式、频道、速率等设置是否受您的操作系统和硬件支持,请执行以下操作:

import pyaudio
soundObj = pyaudio.PyAudio()

# Learn what your OS+Hardware can do
defaultCapability = soundObj.get_default_host_api_info()
print defaultCapability

# See if you can make it do what you want
isSupported = soundObj.is_format_supported(input_format=pyaudio.paInt8, input_channels=1, rate=22050, input_device=0)
print isSupported

isSupported会返回True,如果您的系统可以处理您的设置。内存溢出错误可能是由于某些操作系统+硬件问题引起的。您必须检查您的默认主机API实际上能够做什么。您不需要通过“流类”打开并关闭soundObj以进行查询。

请参阅此 SO 问题:PyAudio 输入溢出

有关其他 pyaudio 文档和帮助,请访问:

http://people.csail.mit.edu/hubert/pyaudio/docs/

编辑:

事实证明,“Errno 输入溢出 - 9981”不是一个微不足道的问题:http://trac.macports.org/ticket/39150

我看到您拥有最新的 portaudio 版本(19.20111121),但 19.20111121_4 声称已经修复了该bug。尝试升级 portaudio 是否有效。


我也遇到了类似的问题,我的portaudio版本是由brew安装的19.20111121版。为了升级portaudio,我在安装时添加了--HEAD选项:“brew install portaudio --HEAD”。这样就解决了溢出问题。 - Joseph Sheedy

0
尽管上述评论表明stop_stream()和close()无法解决问题,但是像这样关闭它们对我有效:
#!/usr/bin/env python
import pyaudio
from pprint import pprint

p = pyaudio.PyAudio()

pprint(p.is_format_supported(input_format=pyaudio.paInt8,
                             input_channels=1,
                             rate=44100,
                             input_device=0))
try:
    stream = p.open(format=pyaudio.paInt8,
                    channels=1,
                    rate=44100,
                    input=True,
                    input_device_index=0,
                    frames_per_buffer=1024)
    data = stream.read(1024)

except IOError as e:
    print e
stream.stop_stream()
stream.close()

pprint(p.is_format_supported(input_format=pyaudio.paInt8,
                              input_channels=1,
                              rate=22050,
                              input_device=0))

try:
    stream = p.open(format=pyaudio.paInt8,
                    channels=1,
                    rate=22050,
                    input=True,
                    input_device_index=0,
                    frames_per_buffer=1024)
    data = stream.read(1024)

except IOError as e:
    print e
stream.stop_stream()
stream.close()

p.terminate()

这将为不支持的速率(异常情况)提供预期结果:

Traceback (most recent call last):
  File "testaudio.py", line 28, in <module>
    input_device=2))
  File "/usr/lib64/python2.7/site-packages/pyaudio.py", line 934, in is_format_supported
    return pa.is_format_supported(rate, **kwargs)
ValueError: ('Invalid sample rate', -9997)

我不得不修改你的脚本(你使用input_device=2,而我使用1),并且在第二个p.open(...22050...)块中你没有“input_device_index=X”,然后我得到了以下错误:`Traceback (most recent call last): `File "test.py", line 12, in ` `input_device=1))` File "/usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/PyAudio-0.2.7-py2.7-macosx-10.7-x86_64.egg/pyaudio.py", line 934, in is_format_supported return pa.is_format_supported(rate, **kwargs) ValueError: ('Invalid number of channels', -9998) - the_real_one
是的,我更改了设备,因为我的计算机上输入设备0不是音频录制设备,但我可以改回去。 - Radio-
根据文档,如果不支持,则预期结果为“ValueError”:“如果配置受支持,则返回True;否则抛出ValueError异常。” - Radio-

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接