Почему я получаю сообщение об ошибке «Недопустимое устройство» при записи устройства с использованием WASAPI и библиотеки звуковых устройств?

Я пытаюсь написать сценарий для записи звука USB с 4-канального аудиоустройства. Я использую Python 3.7 и библиотеку «звуковое устройство». После компиляции код выдает ошибку.

Используя следующий код, я нашел номер устройства, которое хотел записать:

 >>>sounddevice.query_devices()

Это распечатает список всех аудиоустройств. Я хочу записать устройство 20:

20 Microphone (USB Device Audio), Windows WASAPI (4 in, 0 out)

Затем я использовал этот код для записи с этого устройства:

sounddevice.default.device = 20
myrecording = sounddevice.rec(int(duration*fs), samplerate=fs, channels=4, blocking=True) 

Однако я получаю эту ошибку всякий раз, когда пытаюсь записать с нее звук:

line 18, in <module>
myrecording = sounddevice.rec(int(duration*fs), samplerate=fs, channels=4, blocking=True)
 sounddevice.PortAudioError: Error opening InputStream: Invalid device [PaErrorCode -9996]

Я тестировал этот код на 2-канальном устройстве MME и 2-канальном устройстве Windows DirectSound. Он работает с ними обоими. Но это не будет работать с моим 4-канальным устройством WASAPI.


person PetSven    schedule 12.08.2019    source источник


Ответы (2)


Я нашел ответ. Частота дискретизации "fs" должна соответствовать частоте дискретизации по умолчанию для этого устройства в Windows.

Я зашел в Панель управления -> Запись звука -> Щелкнул правой кнопкой мыши на устройстве -> Свойства -> Дополнительно. Там я обнаружил, что формат по умолчанию был «4 канала, 16 бит, 48000 Гц (качество DVD)».

Я изменил значение «fs» с 44100 на 48000, и код заработал.

fs = 48000
sounddevice.default.device = 20
myrecording = sounddevice.rec(int(duration*fs), samplerate=fs, channels=4, blocking=True)
person PetSven    schedule 12.08.2019
comment
Кстати, вы можете найти частоту дискретизации по умолчанию следующим образом: sounddevice.query_devices(20)['default_samplerate'] - person Matthias; 13.08.2019
comment
Теперь я получаю Error starting stream: Unanticipated host error [PaErrorCode -9999]: 'WdmSyncIoctl: DeviceIoControl GLE = 0x00000490 (<...>)' [Windows WDM-KS error 0] - person Winand; 28.06.2021

Вам также может потребоваться вызвать CoInitialize в потоке, в котором вы открываете аудиопоток, используя WASAPI или WDM-KS (потоковая передача ядра).

ctypes.windll.ole32.CoInitialize(None)

В противном случае я получаю следующую ошибку:

Error starting stream: Unanticipated host error [PaErrorCode -9999]: 'WdmSyncIoctl: DeviceIoControl GLE = 0x00000490 (prop_set = {8C134960-51AD-11CF-878A-94F801C10000}, prop_id = 10)' [Windows WDM-KS error 0]

Затем я проверил вызовы Winapi с помощью Rohitab Api Monitor и обнаружил, что CoMarshalInterThreadInterfaceInStream(IAudioClient2, ...) выдает CO_E_NOTINITIALIZED ошибку:  введите описание изображения здесь

person Winand    schedule 28.06.2021