Список всех аудиоустройств с pyaudio Python (привязка к порту аудио)

Я попытался

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 ?


person Basj    schedule 24.12.2013    source источник
comment
Я попробовал ваш код с двоичным файлом pyaudio из: lfd.uci.edu/~ gohlke/pythonlibs/#pyaudio для меня он печатает все мои устройства ASIO   -  person Emile Vrijdags    schedule 22.09.2014
comment
Да, @EmileVrijdags, несколько месяцев назад я связался с М. Гольке, и он обновил свои двоичные файлы с поддержкой ASIO. (мой первоначальный пост был в декабре 2013 г.)   -  person Basj    schedule 22.09.2014
comment
прохладно! Я буду использовать его с пользой ;)   -  person Emile Vrijdags    schedule 27.09.2014


Ответы (3)


Я создал (через некоторое время после публикации этого вопроса) модуль sounddevice для Python, который включает в себя собственные библиотеки DLL с поддержкой ASIO (а также все другие хост-API). Его можно установить с помощью:

pip install sounddevice --user

После этого вы можете перечислить все свои устройства с помощью:

python -m sounddevice

Конечно, вы также можете сделать это в Python:

import sounddevice as sd
sd.query_devices()
person Matthias    schedule 09.12.2015
comment
python3.6 -m sounddevice (ничего не печатает) - person Chris P; 07.06.2020
comment
@ChrisP Создайте задачу, как описано в python-sounddevice.readthedocs.io/en /latest/CONTRIBUTING.html. - person Matthias; 08.06.2020

Я думаю, что ваши ожидания разумны. Эквивалентный код C для перечисления устройств PortAudio даст вам все доступные устройства. Есть несколько вещей, которые могут быть неправильными:

  • Ваша сборка PyAudio не была скомпилирована с поддержкой ASIO. PortAudio будет перечислять только устройства для собственных API-интерфейсов хоста, которые были настроены/скомпилированы во время компиляции.

  • У вас есть 64-разрядная сборка Python/PyAudio, а ваши драйверы устройств ASIO являются 32-разрядными или наоборот (64-разрядные драйверы ASIO и 32-разрядный Python).

Как предлагает Multimedia Mike, вы можете исключить PyAudio из уравнения, перечислив устройства PA из C. Это делает программа pa_devs.c в дистрибутиве PortAudio.

person Ross Bencina    schedule 30.12.2013
comment
Спасибо за ваш ответ. Я часами пытался скомпилировать PyAudio с поддержкой ASIO (благодаря обсуждению github.com/bastibe/PyAudio/pull/4), но, к сожалению, я не могу закончить компиляцию... Если у вас есть время, посмотрите на процедуру, описанную здесь github.com/bastibe/PyAudio/pull/4 @RossBencina, заранее спасибо! - person Basj; 30.12.2013

Я думаю, что проблема может быть в базовой библиотеке PortAudio. У вас есть (или вы можете написать на C) простую утилиту, которая обращается к библиотеке PortAudio и пытается выполнить тот же листинг?

Кроме того, поиск в Google «portaudio asio» показывает этот лакомый кусочек из официальной документации PortAudio:

Бывают случаи, когда PortAudio ограничен возможностями базового нативного аудио API... ASIO SDK позволяет открывать одновременно только одно устройство, поэтому PortAudio/ASIO в настоящее время не поддерживает одновременное открытие нескольких устройств ASIO.

person Multimedia Mike    schedule 24.12.2013
comment
Мне нужно изучить это. У меня нет установленного компилятора / компоновщика C (и этих библиотек тоже) прямо сейчас, и я совершенно ничего не знаю об этом ... У вас есть такие инструменты @MultimediaMike? - person Basj; 25.12.2013
comment
Тот факт, что PortAudio не может одновременно открывать потоки для нескольких устройств ASIO, не имеет отношения к перечислению информации об устройстве. - person Ross Bencina; 30.12.2013
comment
Модуль sounddevice также использует PortAudio, который может найти нужное устройство. - person JakeD; 26.05.2017