为什么在使用 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
错误:
我正在尝试编写一个脚本来从 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
错误: