更改 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:internal
或plug: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 上的声卡的主要内容,如果未能解决你的问题,请参考以下文章