在Linux中以编程方式检查特定类型的设备

我在python程序中(在Linux上)编写了一个段,该段允许用户记录一个简短的音频文件。当然,代码中的第一步是检查是否存在麦克风。不幸的是,我努力做到这一点。

我希望它独立于:

  1. USB麦克风的型号
  2. 插入和枚举音频设备及其顺序的顺序
  3. 设备是热插拔还是冷插拔

这可能吗?我考虑过:

  • udev规则和“ udevadm info”命令(与上面的项目1和3冲突)
  • 播放/记录(指定带有--device选项的设备与项目2冲突)
  • lsusb命令(与1冲突)
  • 检查/ dev和/ sys目录中的特定设备节点或文件(与1和2冲突)

这正在推动我的linux知识的极限,因此我很有可能对上述潜在冲突做出了一些不正确的假设。

cao2826 回答:在Linux中以编程方式检查特定类型的设备

  

当然,代码中的第一步是检查麦克风是否存在。

这比您想象的要棘手。使用pyaudio软件包,发现可用的输入设备相对容易...

import pyaudio

p = pyaudio.PyAudio()

for i in range(p.get_device_count()):
  dev = p.get_device_info_by_index(i)
  if dev.get('maxInputChannels',0) > 0:
    print('Input device: ',dev.get('name'))

...但是在我的系统上,至少有四个不同的输入设备...一个是会议麦克风,一个是从头戴式耳机输入的麦克风,一个是相机上的麦克风,一个是麦克风。在我仅用于驱动一组扬声器的USB声音设备上。无法以编程方式确定我实际要使用的那些。


如果您假设设置简单(例如,只有一个麦克风),则可以要求PyAudio进行录音,它将使用默认的输入设备。有关更多详细信息,请参见PyAudio文档中的示例:

stream = p.open(input=True,...)

这似乎符合您的要求。如果没有可用的输入设备,则会失败:

>>> s = p.open(input=True,rate=44100,channels=2,format=pyaudio.paInt16)
Traceback (most recent call last):
  File "<stdin>",line 1,in <module>
  File "/usr/lib64/python3.7/site-packages/pyaudio.py",line 750,in open
    stream = Stream(self,*args,**kwargs)
  File "/usr/lib64/python3.7/site-packages/pyaudio.py",line 441,in __init__
    self._stream = pa.open(**arguments)
OSError: [Errno -9996] Invalid input device (no default output device)
本文链接:https://www.f2er.com/3141391.html

大家都在问