更改 pyalsaaudio 上的声卡

Posted

技术标签:

【中文标题】更改 pyalsaaudio 上的声卡【英文标题】:Change audio card on pyalsaaudio 【发布时间】:2013-07-14 20:25:35 【问题描述】:

我需要更改 Python 脚本中使用的音频设备。我正在使用 alsaaudio,根据这个http://pyalsaaudio.sourceforge.net/libalsaaudio.html,这只需在创建 PCM 设备时输入卡名即可实现。当我在 Python 上打字时

import alsaaudio
alsaaudio.cards()

我明白了

[u'Intel', u'Q9000']

但将 PCM 对象创建为

alsaaudio.PCM(aa.PCM_CAPTURE, aa.PCM_NORMAL, 'Q9000')

返回

Unknown PCM default:CARD=Q9000

我尝试修改 .asoundrc 以获得我想要的默认配置,但是当它在 Python 上与 aplay 和 arecord 一起使用时,默认音频设备仍然相同。

在 ~/.asoundrc 我放了

pcm.quicktimeWebCam

    type hw
    card Q9000


pcm.internal

    type hw
    card Intel


pcm.!default

    type asym
    playback.pcm
    
        type plug
        slave.pcm "internal"
    
    capture.pcm
    
        type plug
        slave.pcm "quicktimeWebCam"
    

【问题讨论】:

您在.asoundrc 中做了什么? 我通过更改声音管理器上的默认音频设置来逃避这个问题......但基本上在 .asoundrc 中我做了和这里一样的事情......atgn.tumblr.com/post/54588497569/…(在我的树莓派上运行良好) , 使用 Debian) 我在.asoundrc上添加了内容,我在Fedora18上也遇到了同样的问题 如果您同时找到解决方案,我会很感兴趣。 【参考方案1】:

ALSA 设备由“hw:x,y”表示,其中 x 是设备,y 是子设备(如果有)。它期望卡片以“hw:x,y”的形式指定,而不是人类可读的名称。

card_info = 
for device_number, card_name in enumerate(alsaaudio.cards()):
    card_info[card_name] = "hw:%s,0" % device_number

device = alsaaudio.PCM(card=card_info["Q9000"])

【讨论】:

card kwarg 已被弃用,取而代之的是 device,因此对于较新版本的 python,最后一行应为 `device = alsaaudio.PCM(device=card_info["Q9000"]) -alsaaudio【参考方案2】:

alsaaudio 的设备名称有一些未记录的怪癖; 当您使用普通卡 ID(由cards() 返回)时,预计您有一个接受卡参数的default 设备。 (默认default支持该参数。)

要使用特定设备,请使用plug:internalplug:quicktimeWebCam

【讨论】:

感谢您的回答 CL,我尝试使用 alsaaudio.PCM(aa.PCM_CAPTURE, aa.PCM_NORMAL, 'plug:internal 而不是 alsaaudio.PCM(aa.PCM_CAPTURE, aa.PCM_NORMAL, 'Q9000') 但我仍然收到 invalid value for card 错误【参考方案3】:

这似乎是一个常见问题,并报告了bug。混淆在于 alsaaudio 的 PCM 对象对 card 参数的期望。正如上面提到的 wiki 会让您相信它是所需卡片的名称(技术上 ALSA 将其称为 ID)。只要您将卡名称定义为您正在使用的.asoundrc 中的默认设备配置文件的控件,就可以做到这一点。

另一方面,card 参数可以接受整个 PCM 句柄,正如上面 CL 所提到的。正如在提到的错误中看到的,有一个提交的补丁会添加这个 PCM 句柄识别功能。在将其添加到模块之前,确定传递给 PCM 对象的正确句柄的好方法是查看 arecord -L 的输出(或者如果查找播放设备名称,可能是 aplay -L)。

【讨论】:

以上是关于更改 pyalsaaudio 上的声卡的主要内容,如果未能解决你的问题,请参考以下文章

ALSA 更改默认声卡

如何以编程方式更改非默认声音设备的音量?

如何通知我的应用程序默认声音播放设备已更改?

RPi Pyaudio/Portaudio + ALSA:如何选择/更改多路复用器输入

当某些文件更改时,自动请求更改 Github 上的 PR

浏览器上的更改已在本地移动但没有更改