Python 更换pyalsaaudio上的声卡

Python 更换pyalsaaudio上的声卡,python,linux,fedora,alsa,Python,Linux,Fedora,Alsa,我需要更改python脚本上使用的音频设备。我使用的是alsaaudio,根据这一点,在创建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 我试图修改.a

我需要更改python脚本上使用的音频设备。我使用的是alsaaudio,根据这一点,在创建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"
    }
}

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


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

这似乎是一个常见问题,也是一个常见问题。混淆之处在于alsaaudio的PCM对象对card参数的期望值。正如上面提到的wiki会让你相信它是你想要的卡片名称(从技术上来说,ALSA称之为ID)。只要您已将卡名定义为所使用的中默认设备配置文件的控件,则这是正确的


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

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"])

您在
.asoundrc
中做了什么?我通过更改声音管理器上的默认音频设置来避免这个问题。。。但基本上在.asoundrc中,我和这里做的一样。。(这在我的raspberry Pi和Debian上运行得很好)我在上添加了内容。asoundrc,我在Fedora18上也有同样的问题,如果您同时找到了解决方案,我会很感兴趣。感谢您的回答,我尝试将
alsaaudio.PCM(aa.PCM_CAPTURE,aa.PCM_NORMAL,'plug:internal
替换为
alsaaudio.PCM(aa.PCM_CAPTURE,aa.PCM_NORMAL,'Q9000')
但我仍然得到卡的
无效值
错误
kwarg已被弃用,取而代之的是
设备
,因此,对于较新版本的python alsaaudio,最后一行应该是'device=alsaaudio.PCM(device=card_info[“Q9000]”)