1

我正在尝试编写一个脚本来录制来自 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 设备。

4

2 回答 2

1

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

我去了控制面板->录音->右键单击设备->属性->高级。在那里我发现默认格式是“4 通道,16 位,48000 HZ(DVD 质量)”。

我将“fs”的值从 44100 更改为 48000,代码开始工作。

fs = 48000
sounddevice.default.device = 20
myrecording = sounddevice.rec(int(duration*fs), samplerate=fs, channels=4, blocking=True)
于 2019-08-12T21:16:40.400 回答
0

您可能还需要调用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]

CoMarshalInterThreadInterfaceInStream(IAudioClient2, ...)然后我使用 Rohitab Api Monitor 检查了Winapi调用,发现CO_E_NOTINITIALIZED错误: 在此处输入图像描述

于 2021-06-28T06:18:36.613 回答