似乎很多人都遇到了这个问题。我对其进行了一些研究,我认为这意味着在上次调用
stream.read()与当前调用之间,流中的数据丢失了(即,缓冲区的填充速度比清除它的速度快)。
从文档中
Pa_ReadStream()(
stream.read()最终最终调用的PortAudio函数):
@return On success PaNoError will be returned, or PaInputOverflowed ifinput data was discarded by PortAudio after the previous call andbefore this call.
(
PaInputOverflowed然后
IOError在pyaudio包装器中导致)。
如果可以不捕获每个帧就可以了,那么您可以忽略此错误。如果对每个框架都有绝对的关键,那么您将需要找到一种提高应用程序优先级的方法。我对Python不够熟悉,不足以了解执行此操作的pythonic方法,但是值得尝试一个简单的
nice命令,或者将调度策略更改为SCHED_DEADLINE。
编辑:
现在的一个问题是,当引发IOError时,您将丢失该调用中收集的所有帧。要代替忽略溢出并仅返回所拥有的内容,可以应用以下修补程序,这将导致stream.read()忽略输出欠载和来自PortAudio的输入溢出错误(但如果发生其他错误,仍然会抛出错误)。更好的方法是根据您的需要自定义此行为(抛出/不抛出)。
diff --git a/src/_portaudiomodule.c b/src/_portaudiomodule.cindex a8f053d..0878e74 100644--- a/src/_portaudiomodule.c+++ b/src/_portaudiomodule.c@@ -2484,15 +2484,15 @@ pa_read_stream(PyObject *self, PyObject *args) } else { _cleanup_Stream_object(streamObject);++ + Py_XDECREF(rv);++ PyErr_SetObject(PyExc_IOError,+ Py_BuildValue("(s,i)",+ Pa_GetErrorText(err), err));+ return NULL; }-- - Py_XDECREF(rv);-- PyErr_SetObject(PyExc_IOError,- Py_BuildValue("(s,i)",-Pa_GetErrorText(err), err));- return NULL; } return rv;


