当前位置: 首页 > 面试题库 >

PyAudio输入溢出

松铭
2023-03-14
问题内容

我正在尝试在python中制作实时绘图声音。我需要从麦克风上取些东西。

使用PyAudio,尝试使用

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

之后,我得到跟随错误:

* 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模式,所以如果块不可用,我要等待这些块。但是,当我创建除segment或sleep(0.1)以外的try时,我听到了喀哒声,所以这不是我想要的。

请为我的问题提出最佳解决方案?


问题答案:

似乎很多人都遇到了这个问题。我对其进行了一些研究,我认为这意味着在上次调用stream.read()与当前调用之间,流中的数据丢失了(即,缓冲区的填充速度比清除它的速度快)。

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

@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然后IOError在pyaudio包装器中导致)。

如果可以不捕获每个帧就可以了,那么您可以忽略此错误。如果对每个框架都有绝对的关键,那么您将需要找到一种提高应用程序优先级的方法。我对Python不够熟悉,不足以了解执行此操作的pythonic方法,但是值得尝试一个简单的nice命令,或者将调度策略更改为SCHED_DEADLINE。

编辑:

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

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;


 类似资料:
  • 问题内容: 我在Ubuntu 10.10 x64中的Enthought Python发行版(Python 2.6.6)下使用PyAudio。 这是我尝试打开输入流时遇到的相同错误。没有相应的错误“ IOError:无默认输出设备可用” 问题答案: 好的,这不是一个漂亮的解决方案,但对我有用。根据我对ulidtko答案的评论,pyaudio不是问题,而是pyaudio应该绑定到的底层PortAudi

  • PyAudio 提供了 PortAudio 的 Python 语言版本,这是一个跨平台的音频 I/O 库,使用 PyAudio 你可以在 Python 程序中播放和录制音频。 示例代码: """PyAudio Example: Play a WAVE file."""import pyaudioimport waveimport sysCHUNK = 1024if len(sys.argv) < 

  • 我试图导入PyAudio,但它总是给我一个错误。如果我的电脑有问题,我使用的是Windows64x和Python3.9.4。以下是错误:

  • 我正在使用Cassandra 3.10,并试图通过每个查询都有一个表来遵循最佳实践,因此我使用批处理插入发音将多个表作为单个事务插入,但我在cassandra日志中出现以下错误。 [zed.payment,zed.trade_party_b_ref,zed.trade_product_type,zed.trade,zed.fx_variance_swap,zed.trade_party_a_ref

  • 文件 std::fs::File 本身实现了 Read 和 Write trait,所以文件的输入输出非常简单,只要得到一个 File 类型实例就可以调用读写接口进行文件输入与输出操作了。而要得到 File 就得让操作系统打开(open)或新建(create)一个文件。还是拿例子来说明 use std::io; use std::io::prelude::*; use std::fs::File;

  • 回顾一下我们写的第一个 Rust 程序就是带副作用的,其副作用就是向标准输出(stdout),通常是终端或屏幕,输出了 Hello, World! 让屏幕上这几个字符的地方点亮起来。println! 宏是最常见的输出,用宏来做输出的还有 print!,两者都是向标准输出(stdout)输出,两者的区别也一眼就能看出。至于格式化输出,基础运算符和字符串格式化小节有详细说明,这里就不再啰嗦了。 更通用