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

如何通过C#代码获取音频播放设备的声道数及配置信息

当然可以用C#获取音频播放设备的声道数啦!不管是《泰坦陨落2》还是《Apex英雄》里显示的那种Windows原生音频配置信息,我们都能通过代码轻松拿到。下面给你两种实用的实现方式:

方法一:使用NAudio库(推荐,简化开发)

NAudio是.NET社区里非常受欢迎的音频处理工具库,用它能大幅简化音频设备信息的获取流程。

步骤:

  1. 首先通过NuGet安装NAudio包,在Package Manager Console里执行:
    Install-Package NAudio
    
  2. 然后编写代码遍历所有活跃的播放设备,获取每个设备的声道数:
    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

火山引擎 最新活动