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

如何在FFmpeg 5.0.1中仅列出音频输入设备?

问题描述

我正在使用FFmpeg 5.0.1进行音频录制项目,为让用户选择可用的音频输入设备,调用了avdevice_list_input_sources()函数,代码如下:

avdevice_list_input_sources(av_find_input_format("dshow"), NULL, NULL, &device_list);

其中device_list声明为:

AVDeviceInfoList* device_list;

但该方式会列出所有支持的输入设备(包含音频和视频),用户若选择视频设备可能导致程序崩溃。我需要找到仅列出音频输入设备或从device_list中移除视频设备的可行方法,请问该如何实现?

解决方案

方法1:筛选已获取的设备列表

AVDeviceInfoList中的每个AVDeviceInfo实例都带有device_type字段,你可以通过判断该字段的值来过滤出仅音频设备:

// 遍历设备列表,筛选音频设备
for (int i = 0; i < device_list->nb_devices; i++) {
    AVDeviceInfo* dev = device_list->devices[i];
    if (dev->device_type == AVMEDIA_TYPE_AUDIO) {
        // 这是音频设备,可加入自定义的可用设备列表
        printf("音频设备名称: %s\n", dev->device_name);
    }
}

筛选完成后,务必在不再使用设备列表时调用avdevice_free_list_devices(&device_list)释放内存资源。

方法2:调用时直接指定设备类型(推荐)

通过构造AVDictionary参数,在调用avdevice_list_input_sources时直接指定只枚举音频设备,省去后续筛选步骤:

AVDictionary* options = NULL;
// 配置dshow仅枚举音频设备
av_dict_set(&options, "list_devices", "true", 0);
av_dict_set(&options, "device_type", "audio", 0);

avdevice_list_input_sources(av_find_input_format("dshow"), NULL, options, &device_list);

// 使用完毕后释放字典资源
av_dict_free(&options);

这种方式效率更高,因为FFmpeg会直接返回仅包含音频设备的列表,无需额外处理。

关键注意点

  • 必须提前调用avdevice_register_all()完成FFmpeg设备模块的初始化,否则设备枚举会失败。
  • 所有通过FFmpeg分配的资源(如设备列表、字典)都要记得对应释放,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:54:17