python - PyAudio 工作,但每次都吐出错误消息

标签 python alsa pyaudio

我正在使用 PyAudio 记录麦克风的输入。

既然音频对我来说录制得很好,我应该尝试简单地抑制它的错误消息吗?或者有办法解决吗?

ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib audio/pcm_bluetooth.c:1613:(audioservice_expect) BT_GET_CAPABILITIES failed : Input/output error(5)
ALSA lib audio/pcm_bluetooth.c:1613:(audioservice_expect) BT_GET_CAPABILITIES failed : Input/output error(5)
ALSA lib audio/pcm_bluetooth.c:1613:(audioservice_expect) BT_GET_CAPABILITIES failed : Input/output error(5)
ALSA lib audio/pcm_bluetooth.c:1613:(audioservice_expect) BT_GET_CAPABILITIES failed : Input/output error(5)
ALSA lib pcm_dmix.c:957:(snd_pcm_dmix_open) The dmix plugin supports only playback stream
ALSA lib pcm_dmix.c:1018:(snd_pcm_dmix_open) unable to open slave
Cannot connect to server socket err = No such file or directory
Cannot connect to server socket
jack server is not running or cannot be started

最佳答案

您可以尝试清理您的 ALSA 配置,例如,

ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side

是由/usr/share/alsa/alsa.conf引起的:

pcm.rear cards.pcm.rear
pcm.center_lfe cards.pcm.center_lfe
pcm.side cards.pcm.side

一旦你注释掉这些行,那些错误信息就会消失。您可能还需要检查 ~/.asoundrc/etc/asound.conf

也就是说,其中一些消息表明您的配置有问题,尽管它们不会导致任何真正的问题。我不建议你清理 alsa.conf,因为它最初来自 ALSA,当你更新 alsa-lib 时可能会被覆盖。

在 Python 中有一种抑制消息的方法,这里是一个示例代码:

#!/usr/bin/env python
from ctypes import *
import pyaudio

# From alsa-lib Git 3fd4ab9be0db7c7430ebd258f2717a976381715d
# $ grep -rn snd_lib_error_handler_t
# include/error.h:59:typedef void (*snd_lib_error_handler_t)(const char *file, int line, const char *function, int err, const char *fmt, ...) /* __attribute__ ((format (printf, 5, 6))) */;
# Define our error handler type
ERROR_HANDLER_FUNC = CFUNCTYPE(None, c_char_p, c_int, c_char_p, c_int, c_char_p)
def py_error_handler(filename, line, function, err, fmt):
  print 'messages are yummy'
c_error_handler = ERROR_HANDLER_FUNC(py_error_handler)

asound = cdll.LoadLibrary('libasound.so')
# Set error handler
asound.snd_lib_error_set_handler(c_error_handler)
# Initialize PyAudio
p = pyaudio.PyAudio()
p.terminate()

print '-'*40
# Reset to default error handler
asound.snd_lib_error_set_handler(None)
# Re-initialize
p = pyaudio.PyAudio()
p.terminate()

我电脑的输出:

messages are yummy
messages are yummy
messages are yummy
messages are yummy
messages are yummy
messages are yummy
----------------------------------------
ALSA lib pcm_dmix.c:1018:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_dmix.c:957:(snd_pcm_dmix_open) The dmix plugin supports only playback stream
ALSA lib pcm_dmix.c:1018:(snd_pcm_dmix_open) unable to open slave

这些消息是由 alsa-lib 打印出来的,而不是 PyAudio 或 PortAudio。该代码直接使用 alsa-lib snd_lib_error_set_handler 函数设置错误处理程序 py_error_handler,您可以使用它来丢弃任何消息。

我检查了其他 Python ALSA 绑定(bind),pyalsa 和 PyAlsaAudio,它们不支持设置错误处理程序。但是,有 an issue在 PortAudio 上,之前似乎所有 ALSA 错误消息都被抑制了。

关于python - PyAudio 工作,但每次都吐出错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7088672/

相关文章:

python - 如何从Python格式字符串中提取关键字?

python - 加快 Python 循环追加速度

python - 如何正确安装最新版本的 pygame?

playback - 如何使用 ALSA 混合多个 PCM 流

python-3.x - 如何使用 pyaudio 播放 wav 二进制数据?

compression - pyaudio : how to compress audio stream

python - 使用 Django + Gunicorn 应用程序在标准输出上打印用户名

python - 尝试从麦克风录制并实时播放

python - 检查特定的声音(输入:麦克风)

c++ - 当我使用 ALSA 库的函数 `snd_pcm_readi` 时它崩溃了