2011-08-17 69 views
21

我使用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 

回答

18

你可以嘗試清理你的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錯誤消息似乎都被壓縮了。

+0

這不會擺脫傑克的消息,對吧? – Matthias

3

這些看起來像正常的調試消息,因爲它會計算出如何在您的系統上運行。我看不出有什麼理由不應該壓制他們。

你可能會關閉檢測jack服務器,藍牙設備,環繞聲等,但它不是必要的,你可能會搞砸。不要搗亂正在工作的東西!

+0

感謝您的諮詢!我的問題是,腳本顯示需要記錄的文本。一旦你打開記錄,這些文本基本上會被這些調試信息擋住。 – eoinoc

+0

如果你的問題是如何抑制它們,請嘗試將'stderr'重定向到一個文件。 'stderr = open(logfile,'wb')'然後是'sys.stderr = stderr'。讓我知道它是否有效。 – agf

+0

這似乎是有道理的,但沒有效果。例如,消息是否可能通過另一個輸出流傳遞? – eoinoc

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

這絕對是一個優雅的解決方案。 – mertyildiran

0

如果您的默認音頻子系統是Pulseaudio(通常用於Fedora,Ubuntu,Debian),最好是僅在沒有插口和其他子系統的情況下正確重新編譯PyAudio和底層C庫Portaudio,並且只支持Pulseaudio。