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

Posted

技术标签:

【中文标题】c# Naudio 音频电平捕获和显示,仅在打开录音属性时有效【英文标题】:c# Naudio audio level capture and display, only works when sound record property are open 【发布时间】:2018-05-16 11:23:43 【问题描述】:

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

在 Naudio AudioMeterInformation 和 Audio 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),然后将设备放入录制,我只是不知道该怎么做。

【问题讨论】:

我仍在为此苦苦挣扎,我似乎无法理解它。 【参考方案1】:

我遇到了完全相同的问题——我通过开始记录该设备来解决它——即使你什么都不做。对您而言,您需要在 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);
        
    

【讨论】:

非常感谢,我会在周末之前给这个 谢谢 Kris,问题是所选设备是 WASAPI 设备而不是 wave 设备,所以我无法在这两种类型之间匹配设备,索引不匹配,如何一旦我弄清楚在 UI 中选择了哪个设备它确实可以工作,我是否对设备进行硬编码,所以这是一个部分解决方案。任何进一步的反馈将不胜感激

以上是关于c# Naudio 音频电平捕获和显示,仅在打开录音属性时有效的主要内容,如果未能解决你的问题,请参考以下文章

Naudio - 计算音频电平上升到一个电平以上的次数

如何使用 ASIO 和 Naudio 将音频捕获保存在 wav 文件中?

C# NAudio 如何强制/硬编码音频设备(声卡)?

是否可以在 C# 中使用 NAudio 创建新的音频输入?

在 WPF C# 中使用 NAudio 录制音频

无法使用麦克风 c# naudio 捕捉 15k 的音调