42

我正在使用 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
4

8 回答 8

39

您可以尝试清理您的 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-libsnd_lib_error_set_handler函数来设置错误处理程序py_error_handler,您可以使用它来删除任何消息。

我检查了其他 Python ALSA 绑定,pyalsa 和 PyAlsaAudio,它们不支持设置错误处理程序。但是,PortAudio 有一个问题,所有 ALSA 错误消息之前似乎都被抑制了。

于 2012-11-19T11:50:15.207 回答
27

以上所有都是正确的,并且是一个很好的解决方案。我只是来这里建议一种更好的方法来重用错误处理程序代码:

from ctypes import *
from contextlib import contextmanager
import pyaudio

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):
    pass

c_error_handler = ERROR_HANDLER_FUNC(py_error_handler)

@contextmanager
def noalsaerr():
    asound = cdll.LoadLibrary('libasound.so')
    asound.snd_lib_error_set_handler(c_error_handler)
    yield
    asound.snd_lib_error_set_handler(None)

完成此操作后,您可以使用noalsaerr上下文重新使用错误处理程序:

with noalsaerr():
    p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paFloat32, channels=1, rate=44100, output=1)
...
于 2013-07-16T09:37:09.050 回答
4

这些看起来像正常的调试消息,因为它确定了如何在您的系统上运行。我看不出有什么理由不应该压制他们。

您可能会以某种方式关闭对jack服务器、蓝牙设备、环绕声等的检测,但这不是必需的,您可能会搞砸。不要乱搞正在工作的东西!

于 2011-08-17T06:25:36.073 回答
3

sounddevice模块将抑制这些消息,请参阅https://github.com/spatialaudio/python-sounddevice/issues/11

于 2016-03-20T16:30:25.603 回答
1

如果您的默认音频子系统是 Pulseaudio(Fedora、Ubuntu、Debian 常见),最好在没有 Jack 和其他子系统的情况下正确重新编译 PyAudio 和底层 C 库 Portaudio,仅支持 Pulseaudio。

于 2016-12-27T14:33:43.557 回答
1

这将在创建 pyaudio 对象时抑制错误消息

它来自马泰斯的精彩帖子

import time, os, sys, contextlib

@contextlib.contextmanager
def ignoreStderr():
    devnull = os.open(os.devnull, os.O_WRONLY)
    old_stderr = os.dup(2)
    sys.stderr.flush()
    os.dup2(devnull, 2)
    os.close(devnull)
    try:
        yield
    finally:
        os.dup2(old_stderr, 2)
        os.close(old_stderr)

 ...
 ...
 with ignoreStderr():
     self._audio_interface = pyaudio.PyAudio()
于 2021-12-23T20:44:13.823 回答
0

小补充点:

  1. 确保将 alsa.conf 复制到另一个备份位置。
  2. 确保在编辑 alsa.conf 时对编辑器进行 Sudo(例如 sudo vi alsa.conf),这样您就不需要更改 alsa.conf 的文件权限

在我的情况下,这仍然抛出了以下 ALSA 错误:

  • ALSA lib pcm_route.c:867:(find_matching_chmap) 找不到匹配的频道图
  • ALSA lib pcm_route.c:867:(find_matching_chmap) 找不到匹配的频道图
  • ALSA lib pcm_route.c:867:(find_matching_chmap) 找不到匹配的频道图
  • ALSA lib pcm_route.c:867:(find_matching_chmap) 找不到匹配的频道图
于 2019-05-17T12:45:39.243 回答
0

我面临着同样的问题。

只需2>/dev/null在命令末尾添加即可解决我的问题。我只是想抑制错误消息,它就成功了。

例如: python marvin.py 2>/dev/null

于 2021-12-12T17:32:44.350 回答