PyAudio输入溢出-9981-没有解决方案可行。

3
请勿将此问题报告为重复,因为所有已有的解决方案都不适用于我,我已经测试了它们所有的可行性。
所以,我正在尝试在我的RaspberryPi模型B板上运行一个PyAudio示例录音程序,但是我得到了以下错误:
Traceback (most recent call last):
  File "/home/pi/pyaudio/test/testing.py", line 23, in <module>
    data = stream.read(chunk)
  File "/usr/local/lib/python2.7/dist-packages/pyaudio.py", line 605, in read
    return pa.read_stream(self._stream, num_frames)
IOError: [Errno Input overflowed] -9981

已经有一些解决方案可以解决许多用户的问题,但在我的情况下并不适用。

以下是我尝试过的方法:

首先,这是代码:

"""PyAudio example: Record a few seconds of audio and save to a WAVE file."""

import pyaudio
import wave

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()

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

print("* recording")

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
   data = stream.read(CHUNK)
   frames.append(data)

print("* done recording")

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

wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()

我也尝试了当前配置是否受支持,

import pyaudio
p = pyaudio.PyAudio()
if p.is_format_supported(48000.0, 
    input_device=1,
    input_channels=1,
    input_format=pyaudio.paInt16):
    print 'True!'

支持 44,000 和 44,100,但我仍然一遍又一遍地收到相同的错误。

这是我的 USB 音频卡设备信息:

p.get_device_info_by_index(1)

{'defaultSampleRate': 44100.0, 
'defaultLowOutputLatency': 0.011609977324263039, 
'defaultLowInputLatency': 0.011609977324263039, 
'maxInputChannels': 1L, 
'structVersion': 2L, 
'hostApi': 0L, 
'index': 1, 
'defaultHighOutputLatency': 0.046439909297052155, 
'maxOutputChannels': 2L, 
'name': u'Generic USB Audio Device: USB Audio (hw:1,0)', 
'defaultHighInputLatency': 0.046439909297052155}

有人知道为什么我仍然会收到错误提示吗?

你能否发布一下执行 p.get_default_input_device_info() 会发生什么? - joseph
@joseph 我也遇到了同样的问题和错误,我从命令 p.get_default_input_device_info() 获取的信息是: {'defaultSampleRate': 44100.0, 'defaultLowOutputLatency': 0.011609977324263039, 'defaultLowInputLatency': 0.011609977324263039, 'maxInputChannels': 1L, 'structVersion': 2L, 'hostApi': 0L, 'index': 0L, 'defaultHighOutputLatency': 0.046439909297052155, 'maxOutputChannels': 2L, 'name': u'USB PnP Sound Device: USB Audio (hw:0,0)', 'defaultHighInputLatency': 0.046439909297052155}请指导我如何解决这个问题? - Fahadkalis
@FahadUddin,请尝试降低或增加您的块大小。 - Sufiyan Ghori
@SufiyanGhori 我尝试了1024、512、256。 - Fahadkalis
5个回答

5

3

你尝试将exception_on_overflow设置为False了吗?根据Pyaudio文档:

read(num_frames, exception_on_overflow=True)

从流中读取样本。在使用非阻塞模式时不要调用。

参数: num_frames - 要读取的帧数。 exception_on_overflow - 指定在输入缓冲区溢出时是否应抛出IOError异常(或者默默忽略)。默认为True。 Raises IOError: 如果流不是输入流或读取操作失败,则引发IOError。 返回类型:
字符串


1
这似乎不适用于PyAudio 0.2.8。(这是截至2月17日随Pi一起提供的版本)我得到了“意外的关键字”。如果我只尝试添加False(没有关键字,只有参数),则会被告知有太多的参数。 - SiHa
@Sidd 你救了我的一天!谢谢你! - Labo

0
# importing modules for sound handling
# importing modules for sound handling
from sys import byteorder
from array import array
from struct import pack

import pyaudio
import wave

def audioeffect():
    CHUNK = 16 # played with, this can be 2048 1024, 512, 256 etc
    FORMAT = pyaudio.paInt16
    CHANNELS = 1
    RATE = 48000

    p = pyaudio.PyAudio()

    stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                output=True,
                frames_per_buffer=CHUNK)
    r = array('h') # define r
    snd_data = array('h', stream.read(CHUNK)) # read sounddata from input
    r.extend(snd_data)
    stream.stop_stream()
    stream.close()
    p.terminate()
    N = 1
    SumOfSquars = 0
    for i in snd_data:  # determing the value for tel of  
        N = N +1

    # adding all quadrates
    for i in range(0, N-1):
        SumOfSquars = snd_data[i]**2
    Rms_Value = np.sqrt(SumOfSquars / N)

    #print("Rms_Value is  :", Rms_Value)
    return int(Rms_Value)

首先我使用了44100的速率,但是遭遇了错误和溢出等问题。当我将速率改为48000时,它就可以正常工作了。在我的情况下,CHUNK是16,因为我只需要一个非常短的样本来驱动APA LED字符串。 - Eugene
欢迎来到[so]!你能解释一下这个程序是做什么的吗?请记住,回答应该面向更广泛的受众而不仅仅是最初提问者。谢谢! - jpaugh

0

我刚刚增加了块数,看起来它可以工作了!这是我的代码

import pyaudio
import wave

CHUNK = 44100  #just a big number
FORMAT = pyaudio.paInt16
CHANNELS = 1 #i found that my mic has 1 channel
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input_device_index=3, #found that also
                input=True,
                frames_per_buffer=CHUNK)

print("* recording")

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)

print("* done recording")

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

wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()

0
进一步解释@Sidd Rajput的答案,因为我没有找到这个清楚地说明,如果您正在导入-- pyaudio.py本身需要被修改,仅在脚本/项目中设置不足。
def read(self, num_frames, exception_on_overflow=False):

在pyaudio.py v0.2.8中的第589/590行:


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