如何获取无截断的音频输入/输出设备完整名称及对应索引?
如何获取无截断的音频输入/输出设备名称及对应索引?
我用PyAudio获取可用音频输出设备列表时,设备名称被截断为31字符,示例代码及输出如下:
p = pyaudio.PyAudio() info = p.get_host_api_info_by_index(0) numdevices = info.get('deviceCount') for i in range(0, numdevices): if (p.get_device_info_by_index(i).get('maxOutputChannels')) > 0: print("Output Device id ", i, " - ", p.get_device_info_by_index(i).get('name')) p.terminate()输出结果:
Output Device id 3 - Microsoft Sound Mapper - Output Output Device id 4 - 스피커(Realtek High Definition Aud Output Device id 5 - 헤드폰(2- MATA STUDIO C10) Output Device id 6 - LS24AG30x(NVIDIA High Definitio我基于PySide6开发桌面应用,尝试用
QMediaDevices.audioOutputs()、audioInputs()能获取未截断的完整名称,但无法直接拿到设备索引。曾考虑通过名称关联两种方法的结果,但觉得不够稳妥,想找更清晰的解决方案。
解决方案
方法1:通过设备UUID关联PyAudio索引与PySide6完整名称
PySide6的QAudioDevice提供id()方法返回设备唯一UUID,PyAudio的设备信息中也包含deviceUID字段,通过这个唯一标识关联,可避免名称匹配的不确定性:
from PySide6.QtMultimedia import QMediaDevices import pyaudio # 构建PySide6设备UUID到完整名称的映射 qt_device_map = {} for dev in QMediaDevices.audioOutputs(): qt_device_map[dev.id().toString()] = dev.description() # 遍历PyAudio设备,匹配UUID输出完整名称 p = pyaudio.PyAudio() host_info = p.get_host_api_info_by_index(0) device_count = host_info['deviceCount'] for idx in range(device_count): dev_info = p.get_device_info_by_index(idx) if dev_info['maxOutputChannels'] > 0: # 处理可能的字节类型UID dev_uid = dev_info['deviceUID'].decode('utf-8') if isinstance(dev_info['deviceUID'], bytes) else dev_info['deviceUID'] full_name = qt_device_map.get(dev_uid, dev_info['name']) print(f"Output Device id {idx} - {full_name}") p.terminate()
方法2:使用sounddevice库直接获取完整名称与索引
PyAudio的名称截断源于PortAudio底层结构体的字符限制,sounddevice库基于PortAudio开发,默认返回完整设备名称,同时保留索引信息:
import sounddevice as sd # 遍历输出设备,打印索引与完整名称 for idx, dev in enumerate(sd.query_devices()): if dev['max_output_channels'] > 0: print(f"Output Device id {idx} - {dev['name']}")
注:需先安装库,执行
pip install sounddevice即可。
内容的提问来源于stack exchange,提问作者Iced Jin
相关产品推荐
相关产品推荐

