PyAudio正在工作,但每次都会发出错误消息

时间:2011-08-17 06:19:42

标签: 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

6 个答案:

答案 0 :(得分:22)

您可以尝试清理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绑定,pyalsa和PyAlsaAudio,它们不支持设置错误处理程序。但是,PortAudio上有an issue,所有ALSA错误消息似乎都被抑制了。

答案 1 :(得分:13)

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

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

答案 2 :(得分:3)

这些看起来像普通的调试消息,因为它会弄清楚如何在您的系统上运行。我认为你不应该压制它们。

您可能会以某种方式关闭jack服务器,蓝牙设备,环绕声等的检测,但这不是必需的,您可能会搞砸了。不要搞乱那些有用的东西!

答案 3 :(得分:0)

答案 4 :(得分:0)

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

答案 5 :(得分:0)

其他小问题:

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

就我而言,这仍然引发了以下ALSA错误:

  • ALSA库pcm_route.c:867:(find_matching_chmap)未找到匹配的通道图
  • ALSA库pcm_route.c:867:(find_matching_chmap)未找到匹配的通道图
  • ALSA库pcm_route.c:867:(find_matching_chmap)未找到匹配的通道图
  • ALSA库pcm_route.c:867:(find_matching_chmap)没有找到匹配的频道地图