c# - C#Naudio音频电平捕获和显示,仅在打开录音属性时有效

标签 c# audio core-audio audio-recording naudio

我一直在尝试读取音频输入的当前音频电平,使用该数据更新进度条,还使用该数据通过VS2015中的NAudio NuGet包(实际上是3个输入)做出决定,但只能获取打开声音控制面板并在“录制”选项卡上显示音频级别。

关于Naudio AudioMeterInformationAudio level meter for NAudio recording有一些帖子,但是我似乎无法使它起作用,我在这里显然缺少了一些东西,但只是不明白,任何人都可以帮忙。如果有更好的方法做到这一点,那将是很好,我乐于助人

这是我在做的事情,在应用启动时,我检查声音设备并将其放入组合框

public void runGUISetup()
    {
        //Check for ini file
        if (File.Exists(iniFile))
        {
            // Set the IP Address of Vmix from INI File
            if (VmixIPAddress.Value != "")
            {
                tbVmixIPAddress.Text = VmixIPAddress.Value;
            }
            else
            {

            }

        }
        try
        { 
            // Enumerate soundcards and add to combobox
            MMDeviceEnumerator enumerator = new MMDeviceEnumerator();
            var devices = enumerator.EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active);
            cBoxSoundCard1.Items.AddRange(devices.ToArray());
            cBoxSoundCard2.Items.AddRange(devices.ToArray());
            cBoxSoundCard3.Items.AddRange(devices.ToArray());

            //Enumerate IP Local Addresses
            IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());                
            //Populate the drop down list with local IP's
            cbListeningServerIP.Items.AddRange(ipHostInfo.AddressList);
        }
        catch (Exception erSoundcard)
        {
            tbDebug.Text += erSoundcard.Message;                
        }

然后,我运行一个计时器,该计时器收集当前的音频电平并将其转储到移动平均值中,然后更新进度条。这是失败的位,仅在打开声音属性时才起作用。
        // check audio level every 10ms and store in moving average
    private void tmrSC1_Tick(object sender, EventArgs e)
    {

        if (appActive == true)
        {
            if (cBoxSoundCard1.SelectedItem != null)
            {
                var device1 = (NAudio.CoreAudioApi.MMDevice)cBoxSoundCard1.SelectedItem;
                avg1.AddSample((device1.AudioMeterInformation.MasterPeakValue * 100));
            }
            else
            {

            }
            if (cBoxSoundCard2.SelectedItem != null)
            {
                var device2 = (NAudio.CoreAudioApi.MMDevice)cBoxSoundCard2.SelectedItem;
                avg2.AddSample((device2.AudioMeterInformation.MasterPeakValue * 100));

            }
            else
            {
            }
            if (cBoxSoundCard3.SelectedItem != null)
            {
                var device3 = (NAudio.CoreAudioApi.MMDevice)cBoxSoundCard3.SelectedItem;
                avg3.AddSample((device3.AudioMeterInformation.MasterPeakValue * 100));
            }
            else
            {
            }
        }

    }

更新:
根据Kris的反馈,它确实有效,但是只有在我对设备号进行硬编码之后,枚举声音设备(wave和coreaudioAPI)的两种不同方式之间的区别是,设备编号不同,而且每个设备的解密也不同,所以我猜我需要匹配其他功能的设备名称吗?虽然看起来很容易失败。我可能不对,因为我是新手。像以往一样,任何帮助都会得到很大的帮助。这也让我感到震惊,也许我可以使用相同的方法制作设备列表? (coreaudioAPI),然后将设备放入记录中,我只是不确定该怎么做。

UI Display showing selected coreaudioAPI device

最佳答案

我遇到了完全相同的问题-通过开始记录该设备来解决该问题-即使您对此不采取任何措施。对于您来说,您将需要在3台设备上开始录制。

    // deviceno is an index of the returned devices from enumerator.EnumerateAudioEndPoints(DataFlow.All, DeviceState.Active);


    void StartAudioDevice(int deviceno)
    {            

        if (deviceno >= 0)
        {
            try
            {
                wavIn = new WaveInEvent();
                wavIn.DeviceNumber = deviceno;
                wavIn.WaveFormat = new WaveFormat(44100, 1);                    
                wavIn.StartRecording();
            }
            catch(Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }
    }

    void StopAudioDevice()
    {
        try
        {
            wavIn.StopRecording();
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
        }
    }

关于c# - C#Naudio音频电平捕获和显示,仅在打开录音属性时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50369615/

相关文章:

javascript - 是否有任何JavaScript或Flash项目可以在线编辑音频?

actionscript-3 - 为什么在Flash中暂停MP3流时会有延迟

ios - 在播放 AUGraph 时显示 UIActivityIndi​​catorView

c# - 使用 C# 在 Datagridview 中绘制统计图

c# - 找到所有 k 大小的子集,其中包含 n 大小的重复未排序正整数袋的总和 s

c# - 在 C# 中将包含命令行参数的字符串拆分为 string[]

algorithm - 弓弦(例如 fiddle )合成算法

objective-c - 如何使用 RemoteIO 核心音频最好地构建程序

ios - 如何清除或不设置 kLinearPCMFormatFlagIsNonInterleaved

c# - 如何为整个项目启用 C# 8.0 的可空引用类型功能