You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用ALSA API遍历并筛选出所有输入音频设备(麦克风)

遍历ALSA输入音频设备的实现方案

要识别系统中的输入音频设备(如麦克风),你需要在遍历声卡的基础上,进一步查询每个声卡下的PCM子设备,并检查其是否支持捕获流(Capture Stream)——这是ALSA标记输入设备的核心属性。以下是修正并补充后的完整代码,以及关键逻辑说明:

完整实现代码

#define MAX_DEV_STR_LEN 16
#include <alsa/asoundlib.h>
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
    snd_ctl_t *ctlp;
    snd_ctl_card_info_t *card_info;
    snd_pcm_info_t *pcm_info;
    int index = -1;
    int err;
    char *name = malloc(MAX_DEV_STR_LEN);
    if (!name) {
        fprintf(stderr, "内存分配失败\n");
        return 1;
    }

    // 遍历系统中所有声卡
    while (1) {
        snd_card_next(&index);
        if (index == -1)
            break;

        snprintf(name, MAX_DEV_STR_LEN, "hw:%d", index);
        if ((err = snd_ctl_open(&ctlp, name, SND_CTL_NONBLOCK)) != 0) {
            fprintf(stderr, "打开声卡%d失败: %s\n", index, snd_strerror(err));
            continue; // 出错后继续遍历下一个声卡,不直接退出
        }

        snd_ctl_card_info_alloca(&card_info);
        if ((err = snd_ctl_card_info(ctlp, card_info)) != 0) {
            fprintf(stderr, "获取声卡%d信息失败: %s\n", index, snd_strerror(err));
            snd_ctl_close(ctlp);
            continue;
        }

        printf("=== 声卡%d: %s ===\n", index, snd_ctl_card_info_get_name(card_info));

        // 遍历当前声卡下的所有PCM子设备
        int pcm_dev = -1;
        while (1) {
            snd_ctl_pcm_next_device(ctlp, &pcm_dev);
            if (pcm_dev == -1)
                break;

            snd_pcm_info_alloca(&pcm_info);
            snd_pcm_info_set_device(pcm_info, pcm_dev);

            // 检查设备是否支持捕获(输入)流
            snd_pcm_info_set_stream(pcm_info, SND_PCM_STREAM_CAPTURE);
            if ((err = snd_ctl_pcm_info(ctlp, pcm_info)) == 0) {
                printf("输入设备: %s (子设备%d: %s)\n",
                       snd_pcm_info_get_name(pcm_info),
                       snd_pcm_info_get_subdevice(pcm_info),
                       snd_pcm_info_get_subdevice_name(pcm_info));
            }
        }

        snd_ctl_close(ctlp);
    }

    free(name);
    return 0;
}

关键逻辑说明

  1. 遍历声卡:通过snd_card_next函数循环获取系统中所有声卡的索引,直到返回-1表示遍历结束。
  2. 打开声卡控制句柄:用snd_ctl_open打开目标声卡的控制接口,后续所有设备信息查询都依赖这个句柄。
  3. 遍历PCM子设备:每个声卡下可能包含多个PCM设备(如输入、输出、混合设备),通过snd_ctl_pcm_next_device遍历这些子设备。
  4. 识别输入设备:通过snd_pcm_info_set_stream将查询类型设置为SND_PCM_STREAM_CAPTURE(捕获/输入流),如果snd_ctl_pcm_info调用成功,说明该设备支持输入,即为麦克风类设备。
  5. 获取设备名称:使用snd_pcm_info_get_name获取设备通用名称,snd_pcm_info_get_subdevice_name获取子设备的具体名称(比如区分不同的麦克风输入)。

编译与运行

编译时需要链接ALSA库,执行以下命令:

gcc alsa_input_scan.c -o alsa_input_scan -lasound

运行程序即可看到所有输入音频设备的信息。

内容的提问来源于stack exchange,提问作者zivglb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 13:53:31