如何在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
相关产品推荐
相关产品推荐

