PyAudio Input Overflowed -9981 - No solution worki

2019-02-19 00:32发布

Please do not report this question as a duplicate, because none of the already available Solution working for me, I tested them all

So, I am trying to run a PyAudio sample Recording program in my RaspberryPi model B board, This is the error I am getting,

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

There are certain solutions already available that solved many user's problem, which in my case, isn't true.

Here is what I've tried,

First of all, Here is the code,

"""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()

I have also tried if the current configuration is supported or not,

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

Both 44,000 and 44,100 are support but still I'm getting the same error again and again.

This is my USB Audio Card device info,

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}

Does anybody has any idea as why I'm still getting the error ?

4条回答
可以哭但决不认输i
2楼-- · 2019-02-19 00:52
# 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)
查看更多
Ridiculous、
3楼-- · 2019-02-19 00:52

I just increased the chunk number and it appears that it works! here's my code

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()
查看更多
萌系小妹纸
4楼-- · 2019-02-19 00:53

Did you try setting exception_on_overflow to False? From the Pyaudio documentation:

read(num_frames, exception_on_overflow=True)

Read samples from the stream. Do not call when using non-blocking mode.

Parameters: num_frames – The number of frames to read. exception_on_overflow – Specifies whether an IOError exception should be thrown (or silently ignored) on input buffer overflow. Defaults to True. Raises IOError: if stream is not an input stream or if the read operation was unsuccessful. Return type:
string

查看更多
淡お忘
5楼-- · 2019-02-19 00:53

Change your chunk parameter to 8192 instead of 1024. Worked for me. reference: IOError: [Errno Input overflowed] -9981

查看更多
登录 后发表回答