树莓 ALSA 声音输出/输入从机

Posted

技术标签:

【中文标题】树莓 ALSA 声音输出/输入从机【英文标题】:Raspberry ALSA sound output / input slave 【发布时间】:2015-01-19 03:03:30 【问题描述】:

我正在尝试将一台设备设置为播放,另一台设置为捕获,我的nano /etc/asound.conf 有这个:

pcm.!default 
        type asym
        playback.pcm "plughw:1,1"
        capture.pcm  "plughw:1,0"


ctl.!default 
        type hw
        card 0

我可以完美播放声音,但我无法录制声音,我的 python 代码抛出了这个错误:

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.c:2217:(snd_pcm_open_noupdate) 
Unknown PCM cards.pcm.hdmi
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
ALSA lib pcm.c:2217:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline

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

这是我正在运行的代码的一部分:

import pyaudio
class Microphone(Audiosource):
    def __init__(self, device_index = None):
        self.device_index = device_index
        self.format = pyaudio.paInt16 # 16-bit int sampling
        self.SAMPLE_WIDTH = pyaudio.get_sample_size(self.format)
        self.RATE = 16000 # sampling rate in Hertz
        self.CHANNELS = 1 # mono audio
        self.CHUNK = 1024 # number of frames stored in each buffer

        self.audio = None
        self.stream = None

    def __enter__(self):
        self.audio = pyaudio.PyAudio()
        self.stream = self.audio.open(
            input_device_index = self.device_index,
            format = self.format, rate = self.RATE, channels = self.CHANNELS, frames_per_buffer = self.CHUNK,
            input = True, # stream is an input stream
        )
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        self.stream.stop_stream()
        self.stream.close()
        self.stream = None
        self.audio.terminate()

我应该如何解决这个错误?

提前谢谢你。

【问题讨论】:

什么程序产生这个输出? @CL。刚刚贴了一点代码,我是pyaudio。 什么是device_index @CL。我设置为 None|0,如果我将其设置为 1,则会引发编译错误,如果将其设置为 0,则会引发我发布的错误。 @CL。我不知道alsa-base 是否与此有关,但它有此options snd-usb-audio index=0,这是我要使用的,这就是我设置 0 的原因。 【参考方案1】:

我唯一的答案是购买具有输入和输出功能的声卡,并将其设为默认“卡”。我正在尝试做同样的事情。我什至尝试过修改 PyAudio 的源代码,但没有成功。所以目前硬件路线是解决方案。

【讨论】:

【参考方案2】:

pyaudio 基于PortAudio;所有这些愚蠢的消息都是因为 PortAudio 试图枚举音频设备。

pyaudio 设备索引不一定与 ALSA 卡索引相同。 使用get_device_count() 和get_device_info_by_index() 查找要使用的输入设备。

【讨论】:

以上是关于树莓 ALSA 声音输出/输入从机的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重新启动树莓派本身的情况下重新启动 ALSA?

树莓派的输入声音检测

树莓派进阶之路 (036) - 树莓派的音频部分

树莓派声音设置

树莓派没有声音

树莓派4的hdmi无输出黑屏的解决