Qt:获取Linux下可用音频设备列表

3
我想获取我Linux系统上所有可用音频设备的列表。然后,我将把这个列表显示在一个下拉框中,用户可以从中选择要用于录制/播放的设备。根据用户的选择,我将构建QAudioInputQAudioOutput以进行录制/播放。
根据Qt文档,可以使用QAudioDeviceInfo :: availableDevices静态方法来完成此操作。该方法返回我的系统中所有可用音频设备的列表。
我已经使用了此方法来列出音频设备的数量。由于我的系统安装了两个声卡(一个在主板上,另一个是USB设备),因此此方法应该返回只包含两个元素的列表。但它返回了一个包含23个项目的列表。当我访问它们的名称时,我得到了以下结果 -
default
pulse
front:CARD=Intel,DEV=0
surround40:CARD=Intel,DEV=0
surround41:CARD=Intel,DEV=0
surround50:CARD=Intel,DEV=0
surround51:CARD=Intel,DEV=0
surround71:CARD=Intel,DEV=0
dmix:CARD=Intel,DEV=0
dsnoop:CARD=Intel,DEV=0
hw:CARD=Intel,DEV=0
plughw:CARD=Intel,DEV=0
front:CARD=default,DEV=0
surround40:CARD=default,DEV=0
surround41:CARD=default,DEV=0
surround50:CARD=default,DEV=0
surround51:CARD=default,DEV=0
surround71:CARD=default,DEV=0
iec958:CARD=default,DEV=0
dmix:CARD=default,DEV=0
dsnoop:CARD=default,DEV=0
hw:CARD=default,DEV=0
plughw:CARD=default,DEV=0

这背后的原因可能是后端使用了ALSA API。根据这篇文章所述,ALSA将声卡逻辑地划分为多个逻辑音频设备,并在Qt API查询驱动程序时获取这些设备。
我不想列出所有这些名称供用户选择。我想列出类似于 -
HDA-Intel
USB-Audio

用户将从中选择所需的声卡。

有没有办法使用Qt来实现这个?如果不行,我真的很想知道在这里可以使用什么其他替代方法。

2个回答

0

我知道这被称为解决方法,但是看起来您通过在列表中列出CARD=的不同值来获得此信息:在您的示例中,是Intel和default。

如果您的应用程序应该是跨平台的,那么在其他操作系统下,这个命令返回什么?


这个命令可以适当地返回可用的音频设备(我在Windows 7上测试过)。Qt的多媒体依赖于底层音频驱动程序,Linux使用ALSA。ALSA将声卡分成多个设备,因此Qt只是获取并显示它们。无论如何,在这里的解决方法是直接使用ALSA或像PulseAudio或Jack这样的声音服务器(我选择了PulseAudio)。 - MD Sayem Ahmed

-1

显然,唯一的方法是从Qt中启动aplay/arecord进程,获取进程的结果输出并解析输出字符串以查找卡名称和相应的ID。由于这种方法过于依赖这些进程的输出字符串格式,因此我没有使用它。

相反,我选择了PulseAudio服务器来获取系统上可用的设备。我还将其用于音频I/O,因为它提供比Qt的多媒体API更好的控制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接