【问题标题】:Getting input device supported formats with NAudio使用 NAudio 获取输入设备支持的格式
【发布时间】:2013-08-17 17:42:26
【问题描述】:

我想将 NAudio 用于录音程序,但遇到了意想不到的限制。 NAudio.Wave.WaveIn.GetCapabilities(deviceNumber) 返回一个 WaveInCapabilities 结构,但该结构中只有少数字段是公开的。

我特别需要知道设备支持哪些格式。该信息在:

私有 SupportedWaveFormat 支持格式;

我可以将其更改为公共并构建 NAaudio.dll,但我想知道是否有某些原因将该字段标记为私有?或者我可以在其他地方找到这些信息吗?

【问题讨论】:

    标签: windows audio naudio


    【解决方案1】:

    网上有一个例子,我编辑了它,这对我来说可以从不同的设备上获取所有的功能(它很丑,但它可以工作......):

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Collections;
    namespace _4ch_stream
    {
        class clsRecDevices
        {
    
    
            [StructLayout(LayoutKind.Sequential, Pack = 4)]
            public struct WaveInCaps
            {
                public short wMid;
                public short wPid;
                public int vDriverVersion;
                [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
                public char[] szPname;
                public uint dwFormats;
                public short wChannels;
                public short wReserved1;
            }
    
            [DllImport("winmm.dll")]
            public static extern int waveInGetNumDevs();
            [DllImport("winmm.dll", EntryPoint = "waveInGetDevCaps")]
            public static extern int waveInGetDevCapsA(int uDeviceID,
                                 ref WaveInCaps lpCaps, int uSize);
            public ArrayList arrLst = new ArrayList();
            //using to store all sound recording devices strings 
    
            static int devcount = waveInGetNumDevs();
            public static short[] Mid = new short[devcount];
            public static short[] Pid = new short[devcount];
            public static int[] DriverVersion = new int[devcount];
            public static uint[] Formats = new uint[devcount];
            public static short[] Channels = new short[devcount];
            public static short[] Reserved1 = new short[devcount];
    
            public int Count
            //to return total sound recording devices found
            {
                get { return arrLst.Count; }
            }
            public string this[int indexer]
            //return spesipic sound recording device name
            {
                get { return (string)arrLst[indexer]; }
            }
            public clsRecDevices() //fill sound recording devices array
            {
                int waveInDevicesCount = waveInGetNumDevs(); //get total
                if (waveInDevicesCount > 0)
                {
                    for (int uDeviceID = 0; uDeviceID < waveInDevicesCount; uDeviceID++)
                    {
                        WaveInCaps waveInCaps = new WaveInCaps();
                        waveInGetDevCapsA(uDeviceID, ref waveInCaps,
                                          Marshal.SizeOf(typeof(WaveInCaps)));
                        arrLst.Add(new string(waveInCaps.szPname).Remove(
                                   new string(waveInCaps.szPname).IndexOf('\0')).Trim());
                        Mid[uDeviceID] = waveInCaps.wMid;
                        Pid[uDeviceID] = waveInCaps.wPid;
                        Formats[uDeviceID] = waveInCaps.dwFormats;
                        Channels[uDeviceID] = waveInCaps.wChannels;
                        Reserved1[uDeviceID] = waveInCaps.wReserved1;
                        //clean garbage
                    }
                }
            }
        }
    }
    

    希望对您有所帮助。

    【讨论】:

    • 谢谢,我确信这有效。我最终只是将格式公开并重建。
    猜你喜欢
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 2023-03-23
    • 2015-03-30
    • 1970-01-01
    • 2017-05-29
    相关资源
    最近更新 更多