PyAudio工作,但每次都吐出错误信息

我正在使用PyAudio来录制来自麦克风的input。

由于audio对我来说录音很好,我应该试着简单地压制它的错误信息吗? 或者有没有办法解决呢?

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 

您可以尝试清理您的ALSAconfiguration,例如,

 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

这就是说,其中一些消息告诉你的configuration有问题,尽pipe它们不会造成任何实际的问题。 我不build议你清理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函数来设置error handling程序py_error_handler ,您可以使用它来删除任何消息。

我检查了其他Python ALSA绑定,pyalsa和PyAlsaAudio,他们不支持设置error handling程序。 但是,在PortAudio上存在一个问题 ,所有的ALSA错误消息似乎都被压缩了。

以上所有都是真实的,也是一个很好的解决scheme。 我刚来这里build议一个更好的方式重新使用error handling程序代码:

 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上下文重新使用error handling程序:

 with noalsaerr(): p = pyaudio.PyAudio() stream = p.open(format=pyaudio.paFloat32, channels=1, rate=44100, output=1) ... 

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

您可能可能closures检测jack服务器,蓝牙设备,环绕声等,但它不是必要的,你可能会搞砸了。 不要捣乱正在工作的东西!

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

如果您的默认audio子系统是Pulseaudio(Fedora,Ubuntu,Debian常用),那么最好是在没有插口和其他子系统的情况下,正确地重新编译PyAudio和底层的C库Portaudio。