PyAudio 可以工作,但每次都会弹出错误消息

2025-02-18 09:24:00
admin
原创
37
摘要:问题描述:我正在使用 PyAudio 来记录来自麦克风的输入。既然音频录制得很好,我是否应该尝试简单地隐藏其错误消息?或者有办法解决这些问题?ALSA lib pcm.c:2212:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear ALSA lib pcm....

问题描述:

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

解决方案 1:

您可以尝试清理 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-libsnd_lib_error_set_handler函数设置错误处理程序py_error_handler,您可以使用它来删除任何消息。

我检查了其他 Python ALSA 绑定,pyalsa 和 PyAlsaAudio,它们不支持设置错误处理程序。但是,PortAudio 上有一个问题,之前似乎所有 ALSA 错误消息都被抑制了。

解决方案 2:

以上所有都是正确的,也是一个很好的解决方案。我来这里只是想建议一种更好的方法来重用错误处理程序代码:

from contextlib import contextmanager
from ctypes import CFUNCTYPE, c_char_p, c_int, cdll
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)
...

解决方案 3:

我遇到了同样的问题。

只需2>/dev/null在命令末尾添加 即可解决问题。我只是想隐藏错误消息,它确实奏效了。

例如:
python marvin.py 2>/dev/null

解决方案 4:

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

解决方案 5:

这些看起来像是正常的调试消息,因为它会弄清楚如何在您的系统上运行。我认为您没有理由不抑制它们。

您可能可以通过某种方式关闭对jack服务器、蓝牙设备、环绕声等的检测,但这不是必需的,而且可能会把事情搞砸。不要弄乱正在运行的东西!

解决方案 6:

这将在创建 pyaudio 对象时抑制错误消息

它来自 Matthais 的精彩帖子

import time, os, sys, contextlib

@contextlib.contextmanager
def ignoreStderr():
    devnull = os.open(os.devnull, os.O_WRONLY)
    old_stderr = os.dup(2)
    sys.stderr.flush()
    os.dup2(devnull, 2)
    os.close(devnull)
    try:
        yield
    finally:
        os.dup2(old_stderr, 2)
        os.close(old_stderr)

 ...
 ...
 with ignoreStderr():
     self._audio_interface = pyaudio.PyAudio()

解决方案 7:

如果您的默认音频子系统是 Pulseaudio(Fedora、Ubuntu、Debian 常用),最好正确地重新编译 PyAudio 和底层 C 库 Portaudio,仅支持 Pulseaudio,而不支持 Jack 和其他子系统。

解决方案 8:

小补充点:

  1. 确保将 alsa.conf 复制到另一个备份位置。

  2. 确保在编辑 alsa.conf 时使用 Sudo 编辑器(例如 sudo vi alsa.conf),这样您就不需要更改 alsa.conf 的文件权限

就我而言,这仍然抛出了以下 ALSA 错误:

  • ALSA lib pcm_route.c:867:(find_matching_chmap) 未找到匹配的通道图

  • ALSA lib pcm_route.c:867:(find_matching_chmap) 未找到匹配的通道图

  • ALSA lib pcm_route.c:867:(find_matching_chmap) 未找到匹配的通道图

  • ALSA lib pcm_route.c:867:(find_matching_chmap) 未找到匹配的通道图

解决方案 9:

还要摆脱来自 JACK 的消息(基于@livibetter 对 libasound.so 的建议,但这里使用 libjack.so.0)

# Define our error handler type
JACK_ERROR_HANDLER_FUNC = CFUNCTYPE(None)

def py_jack_error_handler():
    pass

jack_c_error_handler = JACK_ERROR_HANDLER_FUNC(py_jack_error_handler)
jack = cdll.LoadLibrary('libjack.so.0')
# Set error handler
jack.jack_set_error_function(jack_c_error_handler)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1324  
  IPD研发管理体系作为一种先进的研发管理理念和方法,对于打造优质产品体验起着至关重要的作用。它涵盖了从产品规划、研发、上市到生命周期管理的全流程,通过整合资源、优化流程、加强团队协作等方式,确保产品能够精准满足用户需求,提升用户满意度和忠诚度。IPD研发管理体系的核心原则IPD研发管理体系以市场驱动为核心原则。这意味着...
IPD集成产品开发   8  
  IPD(Integrated Product Development)产品开发流程作为一种先进的产品开发管理模式,在众多企业中得到广泛应用。它强调跨部门团队协作、并行工程以及基于市场的产品开发理念,旨在提高产品开发效率、缩短产品上市时间、提升产品质量。而成本控制在产品开发过程中至关重要,关乎企业的利润空间和市场竞争力。...
华为IPD流程   6  
  IPD(Integrated Product Development)产品开发流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它从多个维度对产品开发过程进行优化和整合,为企业创新提供了强大的支撑。通过实施IPD产品开发流程,企业能够更加高效地将创意转化为具有市场竞争力的产品,从而在激烈的市场竞争中占据优...
华为IPD流程管理   10  
  华为作为全球知名的科技企业,其产品质量在市场上有口皆碑。华为IPD产品开发流程在确保产品质量方面发挥了至关重要的作用。IPD(Integrated Product Development)即集成产品开发,是一套先进的、成熟的产品开发管理思想、模式和方法。它打破了传统产品开发中各部门之间的壁垒,强调跨部门团队协作,从产品...
IPD集成产品开发流程   9  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用