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

2024-05-17 07:00:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在我的python程序(在Linux上)中编写一个片段,允许用户录制一个短音频文件。当然,代码的第一步是检查是否有麦克风。不幸的是,我很难做到这一点。你知道吗

我希望它独立于:

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

这可能吗?我考虑过:

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

这超出了我linux知识的极限,因此我很有可能对上述潜在冲突做出了一些错误的假设。你知道吗


Tags: 代码用户命令程序插拔顺序规则linux
1条回答
网友
1楼 · 发布于 2024-05-17 07:00:11

Of course, the first step in the code is to check whether a mic is present.

这比你想象的要复杂。使用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)

相关问题 更多 >