如何通过C#代码获取音频播放设备的声道数及配置信息
当然可以用C#获取音频播放设备的声道数啦!不管是《泰坦陨落2》还是《Apex英雄》里显示的那种Windows原生音频配置信息,我们都能通过代码轻松拿到。下面给你两种实用的实现方式:
方法一:使用NAudio库(推荐,简化开发)
NAudio是.NET社区里非常受欢迎的音频处理工具库,用它能大幅简化音频设备信息的获取流程。
步骤:
- 首先通过NuGet安装NAudio包,在Package Manager Console里执行:
Install-Package NAudio - 然后编写代码遍历所有活跃的播放设备,获取每个设备的声道数:
运行这段代码后,你就能看到和游戏里一致的设备音频配置信息了,包括每个播放设备的声道数。using NAudio.CoreAudioApi; using System; class AudioDeviceInfo { static void Main() { var deviceEnumerator = new MMDeviceEnumerator(); // 枚举所有正在活跃的音频播放设备 foreach (var device in deviceEnumerator.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active)) { Console.WriteLine($"设备名称:{device.FriendlyName}"); Console.WriteLine($"声道数:{device.AudioClient.MixFormat.Channels}"); Console.WriteLine("------------------------"); } } }
方法二:调用Windows Core Audio原生API(无第三方依赖)
如果你不想依赖任何第三方库,也可以直接调用Windows的Core Audio COM API来实现。不过这种方式需要处理COM互操作,代码会相对繁琐一些。
简化示例代码:
你需要先定义对应的COM接口和枚举类型,再实现设备枚举和信息提取逻辑:
using System; using System.Runtime.InteropServices; // 定义MMDeviceEnumerator COM类 [ComImport] [Guid("BCDE0395-E52F-467C-8E3D-C4579291692E")] internal class MMDeviceEnumerator { } // 定义IMMDeviceEnumerator接口 [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] internal interface IMMDeviceEnumerator { int EnumAudioEndPoints(DataFlow dataFlow, DeviceState stateMask, out IMMDeviceCollection devices); // 其他接口方法可按需补充,参考Windows SDK文档 } // 定义设备数据流方向枚举 internal enum DataFlow { Render = 0, // 播放设备 Capture = 1, // 录制设备 All = 2 } // 定义设备状态枚举 internal enum DeviceState { Active = 0x00000001, // 活跃设备 // 其他状态可按需补充 } // 其他必要的COM接口(如IMMDeviceCollection、IMMDevice、IAudioClient等)需要自行定义 // 完整接口定义可查阅Windows Core Audio API官方文档 class NativeAudioDeviceInfo { static void Main() { try { var enumerator = (IMMDeviceEnumerator)new MMDeviceEnumerator(); enumerator.EnumAudioEndPoints(DataFlow.Render, DeviceState.Active, out var deviceCollection); // 后续遍历设备集合、获取设备音频格式、提取声道数的逻辑 // 具体实现可参考官方文档完成 } catch (Exception ex) { Console.WriteLine($"获取设备信息失败:{ex.Message}"); } } }
这种方式完全基于Windows原生API,不需要额外安装库,但需要你对COM互操作有一定了解,适合对依赖有严格要求的场景。
补充说明
游戏里显示的音频配置,本质上就是读取了Windows系统中音频设备的默认格式参数,所以我们通过上面两种方法获取到的声道数,和游戏界面里展示的是完全一致的。
内容的提问来源于stack exchange,提问作者user6090619




