我正在尝试在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)输出,两者的区别也一眼就能看出。至于格式化输出,基础运算符和字符串格式化小节有详细说明,这里就不再啰嗦了。 更通用