windows Python PyAudio在麦克风断开时更新程序中的音频设备信息

s4chpxco  于 2022-12-19  发布在  Windows
关注(0)|答案(1)|浏览(150)

Win10/I有一个循环,在那里我用麦克风听背景。我有一个函数,它向我显示我当前的系统音频设备(我将该函数设置为只显示麦克风)。
这就是:

def get_mics_list():
    mics = []
    p = pyaudio.PyAudio()
    for i in range(p.get_device_count()):
        if p.get_device_info_by_index(i)['name'] == 'Microsoft Sound Mapper - Input':
            pass
        elif p.get_device_info_by_index(i)['name'] == 'Microsoft Sound Mapper - Output':
            break
        else:
            mics.append(p.get_device_info_by_index(i))
    return mics

我选择了常量麦克风设备索引进行循环。索引= 1。系统中的默认麦克风。当我在循环时断开麦克风时,我捕获了异常并使用第二个(集成在笔记本电脑中)麦克风继续循环,但我无法使用该函数更新当前可用系统设备的信息。它仍然显示两个麦克风,就像断开连接之前一样。
更换麦克风后,如何更新程序中的系统音频设备信息?

mf98qq94

mf98qq941#

我发现了这个问题,并想出了一个解决方案。显然,PyAudio不允许你更新设备列表而不重新初始化它。我不知道是否有人需要这个,但这里是我的解决方案:
我只通过再次调用PyAudio来更新设备列表。因此,创建如下def:

def init_py_audio():
    # Opened for the first time
    if py_audio is None:
        py_audio = pyaudio.PyAudio()
    
    # Refresh
    else:
        py_audio.terminate()
        py_audio = pyaudio.PyAudio()

此外,在获取设备列表之前,请按如下方式调用它:

import pyaudio

py_audio = None

def get_mics_list():
    # Better use it inside a class and don't use global
    global py_audio

    # Opened for the first time
    if py_audio is None:
        py_audio = pyaudio.PyAudio()

    # Refresh
    else:
        py_audio.terminate()
        py_audio = pyaudio.PyAudio()

    mics = []
    info = py_audio.get_host_api_info_by_index(0)

    # List all devices
    for i in range(0, info.get('deviceCount')):
        # Check number of input channels
        # (If there is at least 1 input channel, then it is suitable as a microphone)
        if py_audio.get_device_info_by_host_api_device_index(0, i).get('maxInputChannels') > 0:
            mics.append(py_audio.get_device_info_by_host_api_device_index(0, i).get('name'))

    return mics

# Will update the device list every time it is called
print(get_mics_list())

相关问题