2011-08-17 4 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를 업데이트하면 덮어 쓸 수 있습니다.

파이썬에서 메시지를 표시 할 수있는 방법이 여기에 샘플 코드입니다 :

#!/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() 

내 컴퓨터에서 출력 : 그 메시지는 ALSA-lib 디렉토리에 의해 인쇄

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 

, PyAudio 또는 PortAudio가 아닙니다. 이 코드는 alsa-lib snd_lib_error_set_handler 함수를 직접 사용하여 오류 처리기 py_error_handler을 설정합니다.이 핸들러를 사용하여 메시지를 삭제할 수 있습니다.

다른 Python ALSA 바인딩 pyalsa 및 PyAlsaAudio를 검사했지만 오류 처리기 설정을 지원하지 않습니다. 그러나 PortAudio에는 an issue이 있으며 이전에 모든 ALSA 오류 메시지가 표시되지 않는 것 같습니다.

+0

이 메시지는 JACK의 메시지를 삭제하지 않습니다. – Matthias

3

정상적인 디버그 메시지는 시스템에서 실행하는 방법을 파악한 것처럼 보입니다. 네가 그들을 억압해서는 안되는 이유는 없어.

jack 서버, 블루투스 장치, 서라운드 사운드 등을 감지하지 못하게 할 수도 있지만 반드시 필요한 것은 아니며 문제가있을 수 있습니다. 일하는 것을 망쳐 놓지 마십시오!

+0

조언 해 주셔서 감사합니다. 내 문제는, 스크립트가 기록하는 데 필요한 텍스트를 표시합니다.레코드를 기록하자 마자이 텍스트는 기본적으로 이러한 디버그 메시지에 의해 방해받지 않게됩니다. – eoinoc

+0

질문을 억제하는 방법이 있다면'stderr'을 파일로 재지향하십시오. 'stderr = open (logfile, 'wb')'그런 다음'sys.stderr = stderr'. 작동하는지 알려주세요. – agf

+0

그건 의미있는 것 같지만 효과가 없습니다. 메시지가 다른 출력 스트림을 통해 들어올 수 있습니까? 예를 들면? – eoinoc

13

위의 내용은 모두 사실이며 좋은 해결책입니다. 당신이 noalsaerr 컨텍스트를 사용하여 오류 처리기를 다시 사용할 수있는이 일을 한 후

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) 

: 난 그냥 다시 사용하여 오류 처리기 코드의 더 좋은 방법을 제안하기 위해 여기에 온

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

그건 분명히 우아한 해결책입니다. – mertyildiran

0

기본 오디오 하위 시스템이 Pulseaudio (Fedora, Ubuntu, Debian의 경우 공통) 인 경우 Jack 및 다른 하위 시스템없이 Pulseaudio를 지원하는 PyAudio 및 기본 C 라이브러리 Portaudio를 올바르게 다시 컴파일하는 것이 좋습니다.

관련 문제