Windows下Core Audio APIs的使用简介

如今,越来越多的产品开始使用音视频功能,其中部分有开发能力和需求的用户,希望能自主实现部分端侧的数据采集和设备管理功能。本篇文章将分享Windows 下音频设备相关能力实现,重点讲述 Core Audio Apls 在实时音视频中需要用到的相关功能,针对各个功能点简单展示实现方式,并给出一些注意事项。

作者:网易智慧企业资深PC端开发工程师

Windows Vista 之后的系统中,音频系统相比之前的系统有很大的变化,产生了一套新的底层 API 即 Core Audio APIs 。

该低层 API 为高层 API【如 Media Foundation(将要取代DirectShow 等高层 API)等 】 提供服务。该系统API具有低延迟、高可靠性、安全性等特点。

本文主要从实时音视频场景中,简单介绍该API的使用。

Core Audio APIs 的组成:MMDevice、EndpointVolume、WASAPI 等。对于实时音视频系统,主要用到的是 MMDevice 及 EndpointVolume 这两套 API。其在系统中的位置如下图:

Windows下Core Audio APIs的使用简介

我对实时音视频中音频设备的使用简单的分为:

1. 设备列表管理

2. 设备初始化

3. 设备功能管理

4. 数据交互

5. 音量管理

6. 设备终端监听

接下来为大家介绍相关功能的实现。

一、相关功能的实现

1、设备列表管理

音频设备的管理,由 MMDevice API来实现。首先我们要创建一 IMMDeviceEnumerator 对象来开始相关功能的调用。

Windows下Core Audio APIs的使用简介 并通过 IMMDeviceEnumerator 可以实现:获取系统默认设备 GetDefaultAudioEndpoint、获取设备集合IMMDeviceCollection、获取指定设备GetDevice、注册设备监听 IMMNotificationClient(监听设备插拔及状态变更)。

通过这些方法,我们能得到系统默认设备、遍历设备列表、打开指定设备并监听设备变更。这样就实现了实时音视频中的设备管理相关的功能。

音频设备的启动是整个音频模块的可靠性的重要节点。根据设备类型和设备数据捕获方式,我们可分为 3 类设备:麦克风采集、扬声器播放、扬声器采集。

首先我们需要一个 IMMDevice 对象,可以在设备管理的相关功能中获取。

Windows下Core Audio APIs的使用简介 再通过 IMMDevice 得到 IAudioClient,设备的格式设置及初始化通过 IAudioClient 对象实现。一般都以共享模式打开,其中麦克风采集及扬声器播使用事件驱动方式处理数据,而扬声器采集以回环的方式驱动处理数据。

简单示例如下:

Windows下Core Audio APIs的使用简介

其中 Wfx是设备格式参数,一般为了保证设备的可用性,使用默认格式(通过IAudioClient::GetMixFormat 获取),如果需要使用自定义格式,可以通过IAudioClient::IsFormatSupported 方法去遍历尝试设备支持格式。

3、设备功能管理

针对麦克风设备,我们通常需要对其进行数据处理。部分硬件设备和系统支持自带的降噪、增益、消回音等功能。但是一般 windows 系统下设备比较繁杂不可控,大都使用软件算法处理。

如果我们需要检测设备是否使用了自带的处理功能及相关参数,需要使用 Topology 模块的功能。

Windows下Core Audio APIs的使用简介

通过 IDeviceTopology,我们能够遍历 IConnector 对象,获得 IAudioAutoGainControl、IAudioVolumeLevel 等能力对象,并处理相关能力。

注意:Iconnector 可能是循环嵌套,在遍历 IConnector 的 IPart时需要判别成员对象IPart 的类型。

4、数据交互

在设备初始化的时候,我们就根据不同的设备选择了不同的模式进行了启动。不同的设备在各自的模式下,数据驱动也各有不同:

麦克风采集:

Windows下Core Audio APIs的使用简介

扬声器播放:

Windows下Core Audio APIs的使用简介

扬声器采集:

Windows下Core Audio APIs的使用简介

在和设备进行数据交互时,我们需要根据数据获取模式,获取对应的服务对象来获取设备数据。其中采集部分使用 IAudioCaptureClient 服务用于获取设备数据,播放使用IAudioRenderClient 服务获取设备数据传入指针。

示例如下:

C:Userswutong10Downloadscarbon (1).png

在实际的数据交互中,需要另开单独线程处理 GetBuffer 及 ReleaseBuffer。其中麦克风采集及扬声器播放时,都是通过设备事件驱动,可以在设备初始化完成后设置响应的事件句柄(IAudioClient::SetEventHandle)。

在整个音视频系统中,设备数据线程还需要统计数据处理时长、采集播放缓存大小等,用户监听检查设备状态及 aec 延迟计算。

5、音量管理

一般音量管理只在设备选定后处理当前设备的音量,所以一般使用IAudioEndpointVolume,该对象通过设备对象 IMMDevice 获取:

Windows下Core Audio APIs的使用简介

得到 IAudioEndpointVolume 对象后,我们能处理当前设备的音量控制:

Windows下Core Audio APIs的使用简介

静音控制:

Windows下Core Audio APIs的使用简介

以及注册 IAudioEndpointVolumeCallback 监听音量状态:

Windows下Core Audio APIs的使用简介

6、设备终端监听

在运行过程中除了设备的插拔等操作,还可能有一些属性变更等,一般用IAudioSessionEvents 监听:

Windows下Core Audio APIs的使用简介

该回调监听,能监听该设备的连接工作状态,名称变更等。

二、一些注意事项

1、线程优先级

在实际的工程开发过程中,我们需要对音频线程的工作线程进行处理。通常通过调用系统模块Avrt.dll,动态调用其下的函数,将调用线程与指定任务(Pro Audio)相关联。上代码:

函数绑定:

Windows下Core Audio APIs的使用简介

在实际的数据处理线程关联:

Windows下Core Audio APIs的使用简介

通过任务绑定,能有效的提升音频数据处理线程的可靠性。

2、工作线程

设备的相关初始化和释放操作,需要在统一的线程处理,部分系统com对象在释放时需要在创建线程释放,不然可能导致释放崩溃。而一些音量选择、监听等的处理可以在用户线程处理,但需要做好多线程安全。

3、设备格式选择

在设备的采样率、声道等格式选择时,如果需要使用自定义的格式,可能出现格式匹配失败或者选择匹配的格式后设备初始化失败的场景。通常此类场景下直接使用默认格式启动。

4、数据处理异常

在数据处理线程处理音频数据时,通常会出现事件响应超时、设备对象异常等情况。通常的处理方法是,先退出数据线程并结束设备,然后检查当前设备是否正常功能,然后重新启动当前设备或选用默认设备。

作者介绍

网易智慧企业资深PC端开发工程师

关于网易云信

网易云信:网易智企旗下融合通信云服务专家、通信与视频 PaaS 平台。集网易 24 年 IM 以及音视频技术打造的融合通信云服务专家,稳定易用的通信与视频 PaaS 平台。提供融合通信与视频的核心能力与组件,包含 IM 即时通讯、5G 消息平台、一键登录、信令、短信与号码隐私保护等通信服务,音视频通话、直播、点播、互动直播与互动白板等音视频服务,视频会议等组件服务,并联合网易易盾推出一站式安全通信方案「安全通」。目前,网易云信已经成功发送 1.6 万亿条消息,覆盖智能终端 SDK 数累计超过 186 亿,我们期待每个智能终端都有云信的融合通信能力。

文章标题:Windows下Core Audio APIs的使用简介,发布者:网易智企,转载请注明出处:https://worktile.com/kb/p/6025

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
网易智企的头像网易智企认证作者
上一篇 2022年3月17日 上午12:49
下一篇 2022年3月17日 上午1:04

相关推荐

  • Android研发技术人员的护城河是什么

    Android研发技术人员的护城河是:1、学习能力;2、发现问题的能力;3、运用知识解决问题的能力;4、类比迁移知识的能力;5、技术水平等。技术发展日新月异,不断学习新知识是技术人员必备的能力。在技术领域的发展初期,掌握更多的知识点可以成为护城河。 一、学习能力 技术发展日新月异,不断学习新知识是技…

    2023年5月31日
    23600
  • mysql如何删除一列

    在MySQL中删除一列涉及使用ALTER TABLE命令,结合DROP COLUMN子句。这个过程包括三个主要步骤:1、确定要删除的列名和表名;2、构造并执行ALTER TABLE命令;3、验证更改。其中,构造并执行正确的SQL命令是关键步骤。本文将详细介绍如何在MySQL中删除一列,并提供相关注意…

    2023年8月16日
    1.8K00
  • 如何进行缺陷管理工作措施

    进行缺陷管理的工作措施主要包含以下五项:1.搭建缺陷工作流程;2.测试人员创建缺陷;3.组织缺陷的签定;4.开发人员处理缺陷;5. 测试人员验证缺陷。在实施缺陷管理之前,建设缺陷管理流程,可以保障相关工作措施有序进行。 1.搭建缺陷工作流程 想要控制和有效管理缺陷问题,需要了解一个缺陷的生命周期以及…

    2022年11月13日
    84900
  • 设计战略与管理是什么

    设计战略与管理是:对设计战略进行统筹安排、科学管理,并围绕企业内部的各项设计工作在企业内部建立一种新的有力的系统来进行管理。设计战略管理实际上是将企业战略进行物化、视觉化的过程,其决定着如何将企业战略转化为视觉新形象。 一、设计战略与管理是什么 设计战略管理是对设计战略进行统筹安排、科学管理,并围绕…

    2023年5月6日
    32900
  • 监控项目具体包括什么工作

    监控项目具体包括以下工作:1、开展基层局部监控;2、分析和预测的结果;3、开展高层全局监控;4、审批变更请求;5、处理其他问题。开展基层局部监控指监督风险、沟通和相关方参与过程,得到工作绩效信息,分析绩效偏差的程度和原因,并预测未来绩效。 1、开展基层局部监控 确认范围、控制范围、进度、成本、质量、…

    2023年1月17日
    73700
  • 项目机会管理流程怎么写

    项目机会管理流程的步骤:一、确定项目机会;二、评估项目机会;三、制定项目机会计划;四、实施项目机会计划;五、评估项目机会成果。在项目机会管理流程中,第一步是确定项目机会。这个过程需要在项目范围、目标、需求和约束条件等方面进行梳理和分析。 一、确定项目机会 在项目机会管理流程中,第一步是确定项目机会。…

    2023年4月27日
    42600
  • 主页中一般包含的基本元素有哪些

    主页中一般包含的基本元素有:1、Text(文本);2、Image(图片);3、Table(表格);4、Hyperlink(超链接)。一般情况下,网页中非常多的内容是文本,可以根据需要对其字体、大小、颜色、底纹、边框等属性进行设置。 1、Text(文本) 一般情况下,网页中非常多的内容是文本,可以根据…

    2023年1月10日
    1.4K00
  • 软件项目管理最重要的是什么

    开展软件项目管理的核心在于确保软件的质量、完成进度、控制成本与满足用户需求的平衡。1、精确的需求分析;2、有效的沟通协作;3、灵活的变更管理;4、清晰的进度规划;5、严格的质量控制。在这些要素中,精确的需求分析显得尤为重要,因为需求分析的准确性决定了软件能否满足用户的实际需求和预期目标,是启动项目和…

    2024年1月8日
    24000
  • 什么软件可以规划行程路线

    可以规划行程路线的软件有:1. Google 地图;2. 高德地图;3. 车来了;4. TripIt;5. Airbnb。Google 地图是一款免费的 Web 应用程序,它可以帮助用户查找地点、获取导航以及规划路线。对于旅行者来说,Google 地图是一个非常有用的工具。 1. Google 地图…

    2023年2月27日
    3.4K00
  • 如何优化文章的标题标签

    优化文章的标题标签的策略和建议:1、简洁明了;2、强调关键词;3、独特性;4、包含品牌名称;5、描述具体内容;6、使用数字和时间;7、避免关键词堆砌;8、测试和优化;9、与内容相关;10、考虑移动设备;11、避免使用过度夸张或误导性的标题标签;12、定期更新和调整。

    2023年11月11日
    25200

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部