sounddevice.PortAudioError: Error querying device -1

项目场景:

最近在做一个录音场景的项目,大概流程就是通过Python的sounddevice包去获取录音设备,然后拾取声音作为后续处理。
我的环境:
操作系统:Ubuntu-20.04
CPU:Intel 6700HQ
内存:8GB
声卡:100 Series/C230 Series Chipset Family HD Audio Controller


问题描述

在shell里直接操作是可以的,不报任何错误。当使用supervisor作为守护保活的时候,诡异的事情发生了。居然出现了找不到输入设备的诡异错误。
下面是错误发生时我抓取的声音设备:

   0 HDA Intel PCH: ALC662 rev3 Analog (hw:0,0), ALSA (0 in, 2 out)
   1 HDA Intel PCH: ALC662 rev3 Digital (hw:0,1), ALSA (0 in, 2 out)
   2 HDA Intel PCH: HDMI 0 (hw:0,3), ALSA (0 in, 8 out)
   3 HDA Intel PCH: HDMI 1 (hw:0,7), ALSA (0 in, 8 out)
   4 HDA Intel PCH: HDMI 2 (hw:0,8), ALSA (0 in, 8 out)
   5 HDA Intel PCH: HDMI 3 (hw:0,9), ALSA (0 in, 8 out)
   6 HDA Intel PCH: HDMI 4 (hw:0,10), ALSA (0 in, 8 out)
   7 sysdefault, ALSA (0 in, 128 out)
   8 front, ALSA (0 in, 2 out)
   9 surround40, ALSA (0 in, 2 out)
  10 surround51, ALSA (0 in, 2 out)
  11 surround71, ALSA (0 in, 2 out)
  12 iec958, ALSA (0 in, 2 out)
  13 spdif, ALSA (0 in, 2 out)
  14 hdmi, ALSA (0 in, 8 out)
  15 samplerate, ALSA (0 in, 128 out)
  16 speexrate, ALSA (0 in, 128 out)
  17 upmix, ALSA (0 in, 8 out)
  18 vdownmix, ALSA (0 in, 6 out)
< 19 default, ALSA (0 in, 128 out)
  20 dmix, ALSA (0 in, 2 out)

<是默认输出设备,>是默认输入设备,*是默认输入输出设备。
为了方便大家理解,我贴出来正常情况下获取的声音列表:

   0 HDA Intel PCH: ALC662 rev3 Analog (hw:0,0), ALSA (0 in, 2 out)
   1 HDA Intel PCH: ALC662 rev3 Digital (hw:0,1), ALSA (0 in, 2 out)
   2 HDA Intel PCH: HDMI 0 (hw:0,3), ALSA (0 in, 8 out)
   3 HDA Intel PCH: HDMI 1 (hw:0,7), ALSA (0 in, 8 out)
   4 HDA Intel PCH: HDMI 2 (hw:0,8), ALSA (0 in, 8 out)
   5 HDA Intel PCH: HDMI 3 (hw:0,9), ALSA (0 in, 8 out)
   6 HDA Intel PCH: HDMI 4 (hw:0,10), ALSA (0 in, 8 out)
   7 sysdefault, ALSA (0 in, 128 out)
   8 front, ALSA (0 in, 2 out)
   9 surround40, ALSA (0 in, 2 out)
  10 surround51, ALSA (0 in, 2 out)
  11 surround71, ALSA (0 in, 2 out)
  12 iec958, ALSA (0 in, 2 out)
  13 spdif, ALSA (0 in, 2 out)
  14 hdmi, ALSA (0 in, 8 out)
  15 samplerate, ALSA (0 in, 128 out)
  16 speexrate, ALSA (0 in, 128 out)
  17 pulse, ALSA (32 in, 32 out)
  18 upmix, ALSA (0 in, 8 out)
  19 vdownmix, ALSA (0 in, 6 out)
  20 dmix, ALSA (0 in, 2 out)
* 21 default, ALSA (32 in, 32 out)

仔细看,两者的差别,正常的有输入设备,不正常的没有输入设备。


原因分析:

原因居然是root账户的问题,如果你使用root账户去调用sounddevice这个包就会出现这个问题,如果你使用非root账户去调用就没有这个问题。
虽然暂时没有完全找出来问题的根源(猜测和用户环境有一定的关系)


解决方案:

我找到了解决问题的办法,那就是使用普通用户去执行程序就没有这个问题了。

su - <普通用户> -c "<脚本>"

总结:

不管怎么说,有解决方案还是好的,特别是急于上线的项目!

至于具体原因,我留在了后续继续研究,等到有结果了再特别说明下,网上的相关问题也不多,我遇到了就随手记录下来了,给同样遇到这种问题的小伙伴一个参考。

就我所有接触的问题来看,Linux上最难解决的问题还是集中在硬件或驱动上,毕竟很多时候官方也不提供Linux上额驱动,因为实在是太冷门了。而硬件这块的问题又主要集中在外设上:像麦克风,立体声设备,摄像头等等。

如果是对硬件有特殊要求的人最好还是使用Windows+WSL2的搭配我觉得甚至强过纯Linux。

猜你喜欢

转载自blog.csdn.net/jiexijihe945/article/details/132713750