PyAudio fonctionne, mais crache des messages d'erreur à chaque fois

J'utilise PyAudio pour enregistrer les entrées du microphone.

puisque l'audio enregistre très bien pour moi, devrais-je simplement essayer de supprimer ses messages d'erreur? Ou y aurait-il un moyen de les résoudre?

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
25
demandé sur eoinoc 2011-08-17 10:19:42

5 réponses

vous pouvez essayer de nettoyer votre configuration ALSA, par exemple,

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

sont causés par /usr/share/alsa/alsa.conf:

pcm.rear cards.pcm.rear
pcm.center_lfe cards.pcm.center_lfe
pcm.side cards.pcm.side

une fois que vous aurez commenté ces lignes, le message d'erreur aura disparu. Vous pouvez également vouloir vérifier ~/.asoundrc et /etc/asound.conf.

cela dit, certains de ces messages disent que quelque chose ne va pas dans votre configuration, bien qu'ils ne causent pas de problème réel. Je ne vous recommande pas de nettoyer l' alsa.conf, parce que ça vient D'ALSA à l'origine, il peut être réécrit lorsque vous mettez à jour alsa-lib.

Il y a un moyen de supprimer le message en Python, voici un exemple de code:

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

une sortie de mon ordinateur:

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

ces messages sont imprimés par alsa-lib, et non par PyAudio ou PortAudio. Le code utilise directement alsa-lib snd_lib_error_set_handler fonction pour définir un gestionnaire d'erreur py_error_handler, que vous pouvez utiliser pour laisser tomber n'importe quel message.

j'ai vérifié d'autres fixations Python ALSA, pyalsa et PyAlsaAudio, ils ne prennent pas en charge la configuration du gestionnaire d'erreurs. Cependant, il y a problème sur PortAudio, tous les messages D'erreur ALSA semblaient avoir été supprimés auparavant.

19
répondu livibetter 2012-11-19 11:50:15

Tout ce qui précède est vrai et une bonne solution. Je suis juste venu ici pour suggérer une meilleure façon de réutiliser le code du gestionnaire d'erreurs:

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)

après avoir fait cela, vous pouvez réutiliser le gestionnaire d'erreurs en utilisant le noalsaerr contexte:

with noalsaerr():
    p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paFloat32, channels=1, rate=44100, output=1)
...
13
répondu Nils Werner 2013-07-16 09:37:09

cela ressemble à des messages de débogage normaux quand il s'agit de savoir comment s'exécuter sur votre système. Je ne vois pas pourquoi vous ne devriez pas les supprimer.

Vous pouvez probablement désactiver la détection de jack serveurs, périphériques bluetooth, surround sound etc. en quelque sorte, mais il n'est pas nécessaire et vous pouvez visser les choses. Ne jouez pas avec ce qui fonctionne!

3
répondu agf 2011-08-17 06:25:36
0
répondu Matthias 2016-03-20 16:30:25

si votre sous-système audio par défaut est Pulseaudio (commun Pour Fedora, Ubuntu, Debian), il est préférable de recompiler correctement PyAudio et la bibliothèque C sous-jacente Portaudio avec la prise en charge de Pulseaudio uniquement sans Jack et autres sous-systèmes.

0
répondu Nikolay Shmyrev 2016-12-27 14:33:43