You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何获取Windows物理音频设备原生支持的音频格式(多方案)

我来分享几个在Windows上获取USB麦克风原生支持音频格式(位深度、采样率)的可行方案,都是实际项目里验证过的,希望能帮到你:

方案1:DirectShow(老牌但可靠的方案)

DirectShow虽然微软现在主推Media Foundation,但它依然能稳定获取设备原生支持的格式,步骤很清晰:

  • 首先用CreateCaptureGraphBuilder2创建捕获图构建器,再枚举系统里的音频捕获设备
  • 找到目标麦克风对应的捕获过滤器后,获取它的IAMStreamConfig接口
  • 调用GetNumberOfCapabilities拿到支持的格式总数,然后循环调用GetStreamCaps逐个获取格式详情,每个格式里包含采样率、位深度、通道数等核心参数
  • 这里拿到的格式是设备驱动直接上报的原生支持格式,不会有系统层的转换
方案2:Media Foundation(现代Windows推荐方案)

如果是Windows 10及以上系统,更推荐用Media Foundation,它对新设备的支持更好:

  • 调用MFEnumDeviceSources枚举所有音频捕获设备,找到目标麦克风的IMFMediaSource
  • 从媒体源中获取IMFStreamDescriptor,再拿到对应的IMFMediaTypeHandler
  • 调用GetMediaTypeCount获取支持的格式数量,循环调用GetMediaType拿到每个IMFMediaType
  • 从媒体类型里提取MF_MT_AUDIO_SAMPLE_RATE(采样率)、MF_MT_AUDIO_BITS_PER_SAMPLE(位深度)等属性,这些都是设备原生支持的参数
方案3:底层USB IOCTL方法(最精准的原生格式获取)

如果想拿到最底层的硬件原生格式,直接操作USB设备描述符是最准确的:

  • SetupDiGetClassDevsSetupDiEnumDeviceInterfaces等函数找到目标USB麦克风的设备句柄
  • 发送IOCTL_USB_GET_DESCRIPTOR请求,获取USB音频类(UAC)的描述符,尤其是音频流(AS)接口的格式描述符
  • 解析这些描述符的结构,就能直接读取设备硬件层面支持的所有采样率、位深度组合,完全没有系统层的加工
  • 这个方法需要你对USB UAC协议有一定了解,不过网上能找到很多UAC描述符的解析示例
方案4:WMI快速查询(适合快速获取基础信息)

如果只是需要快速拿到常用格式,WMI可以满足需求(虽然可能不全):

  • 连接WMI的root\CIMV2命名空间,查询Win32_SoundDevice类,或者通过Win32_PnPEntity配合麦克风的硬件ID筛选
  • 读取AudioSampleRateBitsPerSample等属性,不过要注意部分设备只会返回默认或常用格式,不是全部原生支持的
关于监视Windows系统枚举格式的方法

你提到想通过监视系统来学习枚举方式,这里有两个实用方法:

  • API监视:用API Monitor工具捕获audiodg.exe(Windows音频服务进程)调用的音频相关API,比如Media Foundation或DirectShow的接口调用,就能看到系统是怎么获取格式的
  • USB总线抓包:用Wireshark配合USBPcap插件,捕获系统枚举USB麦克风时的总线数据包,设备返回的USB描述符里就包含了所有原生支持的格式信息,这个是最直接的硬件层面数据

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

火山引擎 最新活动