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。