首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在使用WASAPI和声音设备库录制设备时会出现“无效设备”错误?

为什么在使用WASAPI和声音设备库录制设备时会出现“无效设备”错误?
EN

Stack Overflow用户
提问于 2019-08-12 20:06:53
回答 2查看 1.6K关注 0票数 1

我试图写一个脚本,从一个4声道音频设备记录USB音频.我正在使用Python3.7和“声设备”库。编译后,代码会给出一个错误。

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

代码语言:javascript
运行
复制
 >>>sounddevice.query_devices()

这将打印出所有音频设备的列表。我想录的是设备20:

代码语言:javascript
运行
复制
20 Microphone (USB Device Audio), Windows WASAPI (4 in, 0 out)

然后,我使用这个代码从那个设备中记录:

代码语言:javascript
运行
复制
sounddevice.default.device = 20
myrecording = sounddevice.rec(int(duration*fs), samplerate=fs, channels=4, blocking=True) 

但是,每当我尝试录制音频时,我都会得到这个错误:

代码语言:javascript
运行
复制
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设备工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-12 21:16:40

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

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

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

代码语言:javascript
运行
复制
fs = 48000
sounddevice.default.device = 20
myrecording = sounddevice.rec(int(duration*fs), samplerate=fs, channels=4, blocking=True)
票数 3
EN

Stack Overflow用户

发布于 2021-06-28 06:18:36

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

代码语言:javascript
运行
复制
ctypes.windll.ole32.CoInitialize(None)

否则,我将得到以下错误:

代码语言:javascript
运行
复制
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监视器检查了Winapi调用,发现CoMarshalInterThreadInterfaceInStream(IAudioClient2, ...)给出了CO_E_NOTINITIALIZED错误:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57467633

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档