【问题标题】:List of capture devices (e.g. Microphone, Stereo Mix...) in C#C# 中的捕获设备列表(例如麦克风、立体声混音...)
【发布时间】:2015-07-08 07:41:17
【问题描述】:

如何获取可用声音设备的列表?我的意思是那个图片中的东西。

我想要它在组合框中。我的意思是:

  • 麦克风
  • 立体声混音
  • 线路输入
  • ..还有更多..

但真的是这样吗,因为系统会根据语言本地化系统更改设备的名称,而这正是我所需要的。

例如,在我的语言中,麦克风称为 Mikrofon 和 Stereo Mix = Směšovač 立体声

我需要这些设备名称,没有别的

可以做一些示例代码吗?

【问题讨论】:

标签: c# wpf audio device


【解决方案1】:

使用它对我有用

using NAudio.CoreAudioApi;

MMDeviceEnumerator names = new MMDeviceEnumerator();
var devices = names.EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.Active);            
foreach (var device in devices)
    MessageBox.Show(device.friendlyName);

【讨论】:

    【解决方案2】:

    这是做我需要的..

        [DllImport("winmm.dll", SetLastError = true)]
        static extern uint waveInGetNumDevs();
    
        [DllImport("winmm.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern uint waveInGetDevCaps(uint hwo, ref WAVEOUTCAPS pwoc, uint cbwoc);
    
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
        public struct WAVEOUTCAPS
        {
            public ushort wMid;
            public ushort wPid;
            public uint vDriverVersion;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
            public string szPname;
            public uint dwFormats;
            public ushort wChannels;
            public ushort wReserved1;
            public uint dwSupport;
        }
    
        public static string[] GetSoundDevices()
        {
            uint devices = waveInGetNumDevs();
            string[] result = new string[devices];
            WAVEOUTCAPS caps = new WAVEOUTCAPS();
            using (StreamWriter sw = new StreamWriter("appdata/audio/name"))
            {
                for (uint i = 0; i < devices; i++)
                {
                    waveInGetDevCaps(i, ref caps, (uint)Marshal.SizeOf(caps));
                    result[i] = caps.szPname;
                    sw.WriteLine(caps.szPname);
                }
                return result;
            }
        }
    

    ..但是每一行都被缩短了,我不能全部写出来。

    如何修改列出整体名称的代码?

    谢谢!

    【讨论】:

      【解决方案3】:

      以下代码应该可以帮助您获取音频设备列表,

      ManagementObjectSearcher objSearcher = new ManagementObjectSearcher(
                 "SELECT * FROM Win32_SoundDevice");
      
          ManagementObjectCollection objCollection = objSearcher.Get();
      
          foreach (ManagementObject obj in objCollection)
          {
              foreach (PropertyData property in obj.Properties)
              {
                  Console.Out.WriteLine(String.Format("{0}:{1}", property.Name, property.Value));
              }
          }
      

      现在,您可以使用for-each 枚举列表。

      已编辑

      输出会是这样的,

      Availability:
      Caption:USB Audio Device
      ConfigManagerErrorCode:0
      ConfigManagerUserConfig:False
      CreationClassName:Win32_SoundDevice
      Description:USB Audio Device
      DeviceID:USB\VID_047F&PID_0CA1&MI_00\6&2C037688&0&0000
      PNPDeviceID:USB\VID_047F&PID_0CA1&MI_00\6&2C037688&0&0000
      PowerManagementCapabilities:
      PowerManagementSupported:False
      ProductName:USB Audio Device
      Status:OK
      StatusInfo:3
      SystemCreationClassName:Win32_ComputerSystem
      SystemName:
      Availability:
      Caption:Realtek AC'97 Audio for VIA (R) Audio Controller
      ConfigManagerErrorCode:0
      ConfigManagerUserConfig:False
      CreationClassName:Win32_SoundDevice
      Description:Realtek AC'97 Audio for VIA (R) Audio Controller
      DeviceID:PCI\VEN_1106&DEV_3059&SUBSYS_09011558&REV_60\3&61AAA01&1&8D
      

      从列表中获取 Caption 值。这是简单的文本解析问题;)

      【讨论】:

      • 谢谢,但不是这样。它向我显示了有关我的声卡的许多信息。我需要简单的捕获设备列表,只有图像中的名称(麦克风、线路输入、立体声混音......)
      • 我不想要 USB 音频设备或 Realtek Hight Definition Audio 之类的名称,它是声卡的名称。我需要输入的名称:'(谢谢
      • stackoverflow.com/questions/2208722/… 应该可以帮助您获得用户友好的名称:)
      • 我将这个主题的代码添加到我的程序中,但我无法得到字符串结果(我的意思是用户友好的输入名称).. 嗯,是的,我是初学者,你可以帮忙又是我? :) 谢谢
      • 你得到了什么结果?
      猜你喜欢
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多