使用 Python 的 pyaudio(portaudio 绑定)列出所有音频设备
Posted
技术标签:
【中文标题】使用 Python 的 pyaudio(portaudio 绑定)列出所有音频设备【英文标题】:List all audio devices with Python's pyaudio (portaudio binding) 【发布时间】:2014-01-12 16:16:52 【问题描述】:我试过了
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
列出所有音频设备?
【问题讨论】:
我尝试了您的代码,使用来自 lfd.uci.edu/~gohlke/pythonlibs/#pyaudio 的 pyaudio 二进制文件,它打印了我所有的 ASIO 设备 是的@EmileVrijdags,几个月前我联系了 M. Gohlke,他通过 ASIO 支持更新了他的二进制文件。 (我原来的帖子是在 2013 年 12 月) 酷!我会好好利用它;) 【参考方案1】:我认为问题可能出在底层 PortAudio 库中。你有(或者你可以用 C 语言编写)一个访问 PortAudio 库并尝试执行相同列表的简单实用程序吗?
此外,谷歌搜索“portaudio asio”显示this tidbit from the official PortAudio docs:
在某些情况下,PortAudio 会受到 底层原生音频 API ... ASIO SDK 只允许一个设备 一次打开,所以 PortAudio/ASIO 目前不支持打开 多个 ASIO 设备同时进行。
【讨论】:
我需要研究这个。我现在没有安装 C 编译器/链接器(也没有安装那些库),并且对此一无所知......你会有这样的工具吗@MultimediaMike? PortAudio 无法同时向多个 ASIO 设备打开 streams 的事实与枚举设备信息无关。sounddevice
模块也使用 PortAudio,它可以找到正确的设备。【参考方案2】:
我认为您的期望是合理的。枚举 PortAudio 设备的等效 C 代码将为您提供所有可用设备。有几件事可能是错误的:
您的 PyAudio 构建尚未使用 ASIO 支持进行编译。 PortAudio 将仅枚举已在编译时配置/编译的本机主机 API 的设备。
您有 64 位版本的 Python/PyAudio,并且您的 ASIO 设备驱动程序是 32 位的,反之亦然(64 位 ASIO 驱动程序和 32 位 Python)。
李>正如 Multimedia Mike 建议的那样,您可以通过枚举 C 中的 PA 设备来消除等式中的 PyAudio。PortAudio 发行版中的 pa_devs.c 程序可以做到这一点。
【讨论】:
感谢您的回答。我花了好几个小时尝试编译 PyAudio with ASIO 支持(感谢github.com/bastibe/PyAudio/pull/4 的讨论),但不幸的是我无法完成编译......如果你有时间看看这个过程此处描述github.com/bastibe/PyAudio/pull/4@RossBencina,提前致谢!【参考方案3】:我已经创建了(在这个问题发布后一段时间)用于 Python 的 sounddevice 模块,其中包括支持 ASIO 的 its own DLLs(以及所有其他主机 API)。 它可以安装:
pip install sounddevice --user
之后,您可以列出所有设备:
python -m sounddevice
当然你也可以在 Python 中做到这一点:
import sounddevice as sd
sd.query_devices()
【讨论】:
python3.6 -m sounddevice(不打印) @ChrisP 请按照python-sounddevice.readthedocs.io/en/latest/CONTRIBUTING.html 中的说明创建问题。以上是关于使用 Python 的 pyaudio(portaudio 绑定)列出所有音频设备的主要内容,如果未能解决你的问题,请参考以下文章
Python PyAudio 安装问题(使用 PortAudio)