为什么在使用 WASAPI 和声音设备库录制设备时会出现 "Invalid device" 错误?

Why do I get a "Invalid device" error when recording a device using WASAPI and the sounddevice library?

我正在尝试编写一个脚本来从 4 声道音频设备录制 USB 音频。我正在使用 Python 3.7 和 "sounddevice" 库。编译代码后出现错误。

使用下面的代码,我找到了我要记录的设备的设备号:

 >>>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 设备。

我找到了答案。采样频率 "fs" 必须与 Windows 中该设备的默认采样频率匹配。

我转到控制面板 -> 录音 -> 右键单击​​设备 -> 属性 -> 高级。在那里我发现默认格式是“4 Channel, 16 bit, 48000 HZ (DVD Quality)”。

我将 "fs" 的值从 44100 更改为 48000,代码开始运行。

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

您可能还需要在使用 WASAPI 或 WDM-KS(内核流)打开音频流的线程中调用 CoInitialize

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]

然后我使用 Rohitab Api Monitor 检查了 Winapi 调用,发现 CoMarshalInterThreadInterfaceInStream(IAudioClient2, ...) 给出了 CO_E_NOTINITIALIZED 错误: