使用Python的pyaudio(portaudio绑定)列出所有音频设备

10

我试过

import pyaudio
p = pyaudio.PyAudio()
for i in range(p.get_device_count()):
    print p.get_device_info_by_index(i)

但是我没有得到所有设备的完整列表:例如,在这个列表中,我没有得到ASIO设备。这很奇怪,因为portaudio也应该提供ASIO设备,对吗?

我如何使用pyaudio列出所有音频设备?


1
我尝试了您的代码,并使用http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio上的pyaudio二进制文件,对我来说它打印出了所有我的ASIO设备。 - Emile Vrijdags
是的@EmileVrijdags,我几个月前联系了M. Gohlke,并更新了他的二进制文件以支持ASIO。(我的原始帖子是在2013年12月) - Basj
酷!我会好好利用它的 ;) - Emile Vrijdags
3个回答

9

这个问题发布后一段时间,我创建了一个名为 sounddevice 的Python模块,其中包括支持ASIO(和其他主机API)的DLLs。 可以使用以下命令进行安装:

pip install sounddevice --user

接下来,您可以使用以下命令列出所有设备:

python -m sounddevice

当然,您也可以在Python中进行此操作:
import sounddevice as sd
sd.query_devices()

python3.6 -m sounddevice(不会输出任何内容) - Chris P
@ChrisP 请按照 https://python-sounddevice.readthedocs.io/en/latest/CONTRIBUTING.html 中的描述创建一个问题。 - Matthias

1
我认为你的期望是合理的。枚举PortAudio设备的等效C代码将给出所有可用设备。有几件事情可能出错:
  • 您的PyAudio构建未编译ASIO支持。 PortAudio只会枚举在编译时配置/编译的本机主机API的设备。

  • 您的Python / PyAudio是64位版本,而您的ASIO设备驱动程序是32位的,或者反之亦然(64位ASIO驱动程序和32位Python)。

正如Multimedia Mike所建议的那样,您可以通过从C中枚举PA设备来消除PyAudio的影响。 PortAudio分发中的pa_devs.c程序就是这样做的。

感谢您的回答。我已经花费了数小时尝试编译支持ASIO的PyAudio(感谢讨论https://github.com/bastibe/PyAudio/pull/4),但不幸的是我不能完成编译...如果您有时间看一下这里描述的过程https://github.com/bastibe/PyAudio/pull/4 @RossBencina,在此先感谢您! - Basj

-2

我认为问题可能出在底层的PortAudio库中。您是否有(或者能否编写一个C语言的简单实用程序),以访问PortAudio库并尝试执行相同的列表操作?

此外,谷歌搜索“portaudio asio”会显示来自官方PortAudio文档的这个提示

有些情况下,PortAudio受到底层本地音频API功能的限制... ASIO SDK只允许同时打开一个设备,因此PortAudio/ASIO目前不支持同时打开多个ASIO设备。


我需要学习这个。我现在没有安装C编译器/链接器(以及那些库),并且对此也没有什么了解... @MultimediaMike,你有这样的工具吗? - Basj
PortAudio 无法同时打开到多个 ASIO 设备的 ,这一事实与枚举设备信息无关。 - Ross Bencina
sounddevice 模块也使用 PortAudio,它可以找到正确的设备。 - JakeD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接