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

问题描述 投票:1回答:1

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

我希望它独立于:

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

这可能吗?我考虑过:

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

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

python linux embedded-linux
1个回答
0
投票

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

这比您想象的要棘手。使用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)
© www.soinside.com 2019 - 2024. All rights reserved.