首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyAudio输入溢出

PyAudio输入溢出
EN

Stack Overflow用户
提问于 2012-05-24 16:36:12
回答 9查看 43.7K关注 0票数 36

我正在尝试用python制作实时绘图声音。我需要从我的麦克风里拿点东西。

使用PyAudio,尝试使用

代码语言:javascript
复制
import pyaudio
import wave
import sys

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"
all = []
for i in range(0, RATE / chunk * RECORD_SECONDS):
    data = stream.read(chunk)
    all.append(data)
print "* done recording"

stream.close()
p.terminate()

之后,我得到了以下错误:

代码语言:javascript
复制
* recording
Traceback (most recent call last):
  File "gg.py", line 23, in <module>
    data = stream.read(chunk)
  File "/usr/lib64/python2.7/site-packages/pyaudio.py", line 564, in read
    return pa.read_stream(self._stream, num_frames)
IOError: [Errno Input overflowed] -9981

我不能理解这个缓冲区。我希望使用阻塞IO模式,因此如果数据块不可用,我希望等待这些数据块。但是当我创建try时,除了segment或sleep(0.1),我听到点击,所以这不是我想要的。

请为我的问题建议最好的解决方案?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2015-02-18 09:41:32

似乎很多人都遇到了这个问题。我深入研究了一下,我认为这意味着在上一次对stream.read()的调用和这次调用之间,流中的数据丢失了(即缓冲区填满的速度快于您清除它的速度)。

Pa_ReadStream() ( stream.read()最终调用的PortAudio函数)的文档中:

代码语言:javascript
复制
@return On success PaNoError will be returned, or PaInputOverflowed if
input data was discarded by PortAudio after the previous call and
before this call.

(然后,PaInputOverflowed会在pyaudio包装器中引发一个IOError )。

如果您可以不捕获每一帧,那么您可以忽略此错误。如果拥有每一帧对你来说是绝对关键的,那么你需要找到一种方法来提高你的应用程序的优先级。我对Python还不够熟悉,不知道如何使用Python来实现这一点,但是值得尝试一个简单的nice命令,或者将调度策略更改为SCHED_DEADLINE。

编辑:

现在的一个问题是,当抛出IOError时,您将丢失在该调用中收集的所有帧。要忽略溢出并只返回已有的内容,您可以应用下面的修补程序,这将导致stream.read()忽略来自PortAudio的输出欠载和输入溢出错误(但如果发生不同的错误,仍会抛出一些错误)。一个更好的方法是使这个行为(抛出/不抛出)可根据您的需要进行自定义。

代码语言:javascript
复制
diff --git a/src/_portaudiomodule.c b/src/_portaudiomodule.c
index a8f053d..0878e74 100644
--- a/src/_portaudiomodule.c
+++ b/src/_portaudiomodule.c
@@ -2484,15 +2484,15 @@ pa_read_stream(PyObject *self, PyObject *args)
     } else {
       /* clean up */
       _cleanup_Stream_object(streamObject);
+
+      /* free the string buffer */
+      Py_XDECREF(rv);
+
+      PyErr_SetObject(PyExc_IOError,
+                       Py_BuildValue("(s,i)",
+                                     Pa_GetErrorText(err), err));
+      return NULL;
     }
-
-    /* free the string buffer */
-    Py_XDECREF(rv);
-
-    PyErr_SetObject(PyExc_IOError,
-                   Py_BuildValue("(s,i)",
-                                 Pa_GetErrorText(err), err));
-    return NULL;
   }

   return rv;
票数 13
EN

Stack Overflow用户

发布于 2016-02-17 04:38:55

pyaudio.Stream.read()有一个关键字参数exception_on_overflow,请将其设置为False。

对于您的示例代码,如下所示:

代码语言:javascript
复制
import pyaudio
import wave
import sys

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"
all = []
for i in range(0, RATE / chunk * RECORD_SECONDS):
    data = stream.read(chunk, exception_on_overflow = False)
    all.append(data)
print "* done recording"

stream.close()
p.terminate()

有关更多详细信息,请参阅PyAudio documentation

票数 31
EN

Stack Overflow用户

发布于 2012-12-08 13:10:13

当我运行你的代码时,我得到了同样的错误。我查看了默认音频设备macbook内置麦克风的默认采样率,它是48000 at,而不是44100 at。

代码语言:javascript
复制
p.get_device_info_by_index(0)['defaultSampleRate']
Out[12]: 48000.0

当我将RATE更改为此值时,它起作用了。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10733903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档