news 2026/10/29 2:03:43

Linux FFmpeg深度解析之avdevice_list_input_sources调用流程与实战(六)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux FFmpeg深度解析之avdevice_list_input_sources调用流程与实战(六)

简介:CSDN博客专家、《Android系统多媒体进阶实战》作者

博主新书推荐:《Android系统多媒体进阶实战》🚀
Android Audio工程师专栏地址:Audio工程师进阶系列【原创干货持续更新中……】🚀
Android多媒体专栏地址:多媒体系统工程师系列【原创干货持续更新中……】🚀
专题一 二:AAOS车载系统+AOSP14系统攻城狮入门视频实战课🚀
专题三:Android14 Binder之HIDL与AIDL通信实战课🚀
专题四:Android15快速自定义与集成音效实战课🚀
专题五:Android15音频策略实战课🚀
专题六:Android15音频性能实战课(无声/杂音/断音/爆音实战案例)🚀

人生格言:人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

点击获取二维码


🍉🍉🍉文章目录🍉🍉🍉

      • 🌻1.前言
      • 🌻2.应用场景和用法
        • 2.1枚举输入采集源
        • 2.2函数原型与返回语义
      • 🌻3.调用流程剖析
        • 3.1创建临时设备上下文
        • 3.2调用设备格式的枚举回调
      • 🌻4.实战案例
        • 4.1准备ALSA输入格式
        • 4.2枚举设备并读取结果
        • 4.3完整代码
      • 🌻5.总结

🌻1.前言

本篇目的:理解avdevice_list_input_sources()如何根据输入设备格式枚举可用采集源,并通过程序读取设备名称和描述。

应用要从摄像头或音频设备采集数据时,通常要先让用户选择一个输入源。avdevice_list_input_sources()负责调用输入设备格式提供的枚举能力,返回设备列表;它不打开采集流,也不读取音视频帧。

输入设备格式

avdevice_list_input_sources

设备名称和选项

设备格式枚举回调

AVDeviceInfoList设备列表

🌻2.应用场景和用法

2.1枚举输入采集源

这个接口适合在真正打开设备之前获取候选输入源。

场景接口用途后续动作
摄像头选择列出输入格式发现的视频设备将选中的设备名传给打开输入接口
音频设备选择通过ALSA等输入格式枚举采集设备将设备名交给对应输入格式
采集源诊断检查当前构建和系统环境能发现哪些设备对比设备名、描述和系统设备状态
应用选项初始化使用设备私有选项影响枚举后续打开设备时传入相同选项

设备枚举由具体的AVInputFormat实现。某个输入格式没有实现设备列表回调时,接口会返回AVERROR(ENOSYS)。即使枚举成功,设备列表也不保证覆盖所有可用设备,具体发现范围取决于设备后端和系统环境。

2.2函数原型与返回语义

函数原型如下:

intavdevice_list_input_sources(constAVInputFormat*device,constchar*device_name,AVDictionary*device_options,AVDeviceInfoList**device_list);
参数含义
device输入设备格式,例如alsa或v4l2对应的AVInputFormat
device_name设备格式名称;可与device二选一,同时提供时以device为准
device_options传给设备枚举上下文的私有选项,可以为NULL
device_list接收枚举结果的输出参数,调用者应传入有效指针

成功时返回发现的设备数量,并通过device_list返回AVDeviceInfoList。失败时返回负的AVERROR错误码。列表中的每一项包含设备名称、描述和可提供的媒体类型。

该接口会在内部创建输入设备上下文,复制并应用选项,调用通用设备枚举接口,然后释放临时上下文。调用者需要使用avdevice_free_list_devices()释放返回列表。枚举结果不是采集流;实际采集仍需之后调用avformat_open_input()。

🌻3.调用流程剖析

3.1创建临时设备上下文

调用avdevice_list_input_sources()时,FFmpeg先根据device和device_name创建临时输入设备上下文。传入device_options时,内部会复制字典,再把选项应用到临时上下文,因此不会把内部应用选项时的字典变化带回调用者。

随后,函数调用avdevice_list_devices()完成统一的列表创建与分派。临时上下文在流程结束时释放,无论枚举成功还是失败。

AVInputFormat与设备选项

创建临时输入设备上下文

应用设备私有选项

调用avdevice_list_devices

释放临时上下文

3.2调用设备格式的枚举回调

avdevice_list_devices()检查上下文是否包含输入或输出格式,并检查对应格式是否实现get_device_list回调。没有回调时,它将输出列表置为NULL并返回AVERROR(ENOSYS)。

如果回调存在,通用层分配AVDeviceInfoList,将default_device初始化为-1,然后调用具体设备格式的回调。回调负责发现设备并向列表添加信息。发生错误时,通用层释放已创建的列表;成功时,返回设备数量,列表所有权交给调用者。

否

是

失败

成功

临时AVFormatContext

输入格式支持枚举

返回ENOSYS

创建AVDeviceInfoList

调用设备格式回调

枚举结果

释放列表并返回错误

返回设备数量和列表

以ALSA输入格式为例,设备后端通过ALSA设备提示枚举采集端点,并填充设备名称和描述。接口只返回这些发现信息,不替应用选择设备,也不保证设备随后一定能成功打开。

🌻4.实战案例

4.1准备ALSA输入格式

示例使用ALSA输入格式枚举音频采集源。设备枚举依赖FFmpeg构建时包含ALSA输入设备支持,也依赖当前系统能够访问ALSA设备信息。

constAVInputFormat*input_format;avdevice_register_all();input_format=av_find_input_format("alsa");

如果input_format为NULL,说明当前运行环境没有找到该输入格式,应先检查FFmpeg构建配置和设备注册状态。

4.2枚举设备并读取结果

将输入格式传给avdevice_list_input_sources(),检查返回值。返回值大于等于0时表示枚举成功,数值是设备数量;返回值小于0时表示发生错误。

每项设备信息由列表拥有。完成访问后调用avdevice_free_list_devices(),不要单独释放列表内部的名称、描述或媒体类型数组。

4.3完整代码
#include<stdio.h>#include<libavdevice/avdevice.h>#include<libavformat/avformat.h>#include<libavutil/error.h>staticvoidprint_error(interror){charmessage[AV_ERROR_MAX_STRING_SIZE];av_strerror(error,message,sizeof(message));fprintf(stderr,"Device enumeration failed: %s\n",message);}intmain(void){constAVInputFormat*input_format;AVDeviceInfoList*device_list=NULL;intcount;inti;/* 注册设备格式,并查找ALSA音频输入格式 */avdevice_register_all();input_format=av_find_input_format("alsa");if(input_format==NULL){fprintf(stderr,"ALSA input format is unavailable\n");return1;}/* 设备名和私有选项都为空,由ALSA后端枚举默认可发现的输入源 */count=avdevice_list_input_sources(input_format,NULL,NULL,&device_list);if(count<0){print_error(count);avdevice_free_list_devices(&device_list);return1;}/* 读取设备名称、描述和媒体类型信息 */for(i=0;device_list!=NULL&&i<device_list->nb_devices;i++){constAVDeviceInfo*device=device_list->devices[i];printf("device: %s\n",device->device_name!=NULL?device->device_name:"(unknown)");printf("description: %s\n",device->device_description!=NULL?device->device_description:"(no description)");printf("media types: %d\n",device->nb_media_types);}/* 释放接口返回的完整设备列表 */avdevice_free_list_devices(&device_list);return0;}

🌻5.总结

avdevice_list_input_sources()根据输入设备格式枚举采集源并返回由调用者释放的设备列表,但不打开采集流或读取音视频帧。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/29 2:03:28

【AI】Artemis-codex:来给你的Agent配一台手机吧

【AI】Artemis-codex&#xff1a;来给你的Agent配一台手机吧 前言 前面几篇文章主要在折腾 LangChain 和 LangGraph&#xff0c;从最小 Agent、工具调用&#xff0c;一直写到 RAG 和条件分支。这次给 Agent 加一个更直观的工具&#xff1a;一台手机。 电脑旁边有闲置安卓机的…

作者头像 李华
网站建设 2026/10/29 2:02:43

## 机器学习环境搭建

## 开发环境搭建 ## 安装 ### 简介: 指的是一个开源的发行版本, 其包含了 Conda 以及等一千八百多个科学包及其依赖项。因为包含了大量的科学包, 和可以把不同的环境隔离开 , 所以我们选择去 ### 下载地址: 下载自己对应的版本, 五百兆左右 , 如果下载速度慢可以移步国内镜像。…

作者头像 李华
网站建设 2026/10/29 2:02:11

Openlayers地图管道中添加双向燕尾水流动画效果

1&#xff1a;需求是这样的&#xff0c;需要在openlayers地图加载的管道上添加双向燕尾水流动画效果如下 openlayers代码如下&#xff1a; // 启动水流动画&#xff08;蓝底带箭尾效果&#xff09;startFlowAnimation() {if (this.flowPathFeatures.length 0) return;// 清理…

作者头像 李华
网站建设 2026/10/29 2:00:54

实时湖仓与区块链:数据架构的信任革命

1. 引言 在大数据技术演进的浪潮中&#xff0c;实时湖仓&#xff08;Real-Time Lakehouse&#xff09;与区块链&#xff08;Blockchain&#xff09;看似分属两个截然不同的技术领域——前者追求数据的流动性与分析效率&#xff0c;后者强调数据的不可篡改与信任机制。然而&…

作者头像 李华
网站建设 2026/10/29 2:00:52

《派出你的AI同事:WorkBuddy案例实战》085:IM 与邮件新连接器实战

《派出你的AI同事:WorkBuddy案例实战》085:IM 与邮件新连接器实战 本文是《唤醒你的 AI 同事:WorkBuddy 全栈指南》系列 卷三(案例实战) 的第 85 篇。前面讲了国内办公平台(企业微信/飞书/钉钉);这一篇补齐国际化 IM 与邮件方向的新连接器。 ⚠️ 版本说明:本篇依据**…

作者头像 李华