尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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对应的AVInputFormatdevice_name设备格式名称可与device二选一同时提供时以device为准device_options传给设备枚举上下文的私有选项可以为NULLdevice_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_formatav_find_input_format(alsa);如果input_format为NULL说明当前运行环境没有找到该输入格式应先检查FFmpeg构建配置和设备注册状态。4.2枚举设备并读取结果将输入格式传给avdevice_list_input_sources()检查返回值。返回值大于等于0时表示枚举成功数值是设备数量返回值小于0时表示发生错误。每项设备信息由列表拥有。完成访问后调用avdevice_free_list_devices()不要单独释放列表内部的名称、描述或媒体类型数组。4.3完整代码#includestdio.h#includelibavdevice/avdevice.h#includelibavformat/avformat.h#includelibavutil/error.hstaticvoidprint_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_listNULL;intcount;inti;/* 注册设备格式并查找ALSA音频输入格式 */avdevice_register_all();input_formatav_find_input_format(alsa);if(input_formatNULL){fprintf(stderr,ALSA input format is unavailable\n);return1;}/* 设备名和私有选项都为空由ALSA后端枚举默认可发现的输入源 */countavdevice_list_input_sources(input_format,NULL,NULL,device_list);if(count0){print_error(count);avdevice_free_list_devices(device_list);return1;}/* 读取设备名称、描述和媒体类型信息 */for(i0;device_list!NULLidevice_list-nb_devices;i){constAVDeviceInfo*devicedevice_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()根据输入设备格式枚举采集源并返回由调用者释放的设备列表但不打开采集流或读取音视频帧。
RELATED

相关推荐

硬盘数据恢复,这5个妙招汇总操作轻松,效果显著!

硬盘数据恢复,这5个妙招汇总操作轻松,效果显著!

在数字信息时代,硬盘如同我们的数据宝库,存储着工作文档、生活照片、珍贵视频等重要内容。然而,意外总是防不胜防,误删除、病毒入侵、硬盘老化等问题,随时可能让数据丢失。当遭遇硬盘数据丢失困境时,掌握有…

📅 2026/10/29 2:03:47
【StrongSort 03】多轨迹算法StrongSort改进点

【StrongSort 03】多轨迹算法StrongSort改进点

Strongsort改进点 StrongSORT(论文 StrongSORT: Make DeepSORT Great Again)在 DeepSORT 基础上提出的四项在线改进 一项相机运动补偿。本工程全部实现为可开关参数,五项统一默认开启(测试脚本加对应 --no-nsa / --no-ema / --n…

📅 2026/10/29 2:03:47
华为云码道本地部署手册

华为云码道本地部署手册

1. 扫描下方二维码或点击超链 👉👉👉 海量tokens等你来领。 勾选服务声明,点「免费开通」,开通华为云码道CodeArts代码智能体。 2. 下载安装码道IDE,体验本地开发与调试。 3. 登录码道IDE,领取积…

📅 2026/10/29 2:03:46
MORE NEWS

更多资讯

📰

专科生论文写作工具评测与高效使用指南

1. 论文写作工具的价值与选择标准作为一名经历过论文写作煎熬的老学长,我深知专科生在毕业季面临的双重压力:既要完成实习工作,又要应付毕业论文。传统写作方式下,从选题到定稿往往需要消耗2-3个月时间,而专科生的学制…

📰

SQL正则表达式实战:从基础到高级应用

1. SQL正则表达式入门:为什么我们需要REGEXP?第一次在SQL里看到REGEXP时,我正面临一个棘手的数据清洗任务。客户提供的历史订单数据中,地址字段杂乱无章地混合了中文、英文、数字和特殊符号。传统的LIKE操作符需要写十几个嵌套的W…

📰

华为CE交换机M-LAG配置与故障排查实战

1. 华为CE系列交换机M-LAG级联实战指南在数据中心网络架构中,设备级联的可靠性与性能直接决定了业务连续性质量。华为CE系列交换机凭借其硬件级高可用设计,通过M-LAG(Multichassis Link Aggregation Group)技术实现跨设备链路聚合…

📰

2026年微信C盘存储优化与清理全攻略

1. 2026年电脑C盘爆满现状与微信存储机制解析微信作为国民级社交软件,其文件存储机制一直是Windows用户C盘空间管理的痛点。2026年的微信Windows版(版本号应已迭代至4.5.x)默认将所有聊天记录、图片视频、文档等数据存储在C:\Users\[用户名]\…

📰

微信C盘空间占用分析与清理优化方案

1. 为什么C盘总是被微信占满?微信作为国民级通讯工具,其文件存储机制存在几个典型特点:首先,默认将所有聊天文件(包括图片、视频、文档)保存在C:\Users[用户名]\Documents\WeChat Files目录下;其…

📰

Java技术栈在充电桩物联网平台中的应用与实践

1. 项目概述:充电桩物联网与新能源的Java技术融合充电桩作为新能源汽车基础设施的核心组件,其智能化程度直接影响着用户体验和能源利用效率。传统充电桩系统普遍存在设备孤岛、数据割裂、运维低效等问题,而基于Java技术栈构建的物联网平台正成…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬