c# NAudio 采集麦克风电平并显示在progressBar 2021-02-16

一、写在前面

进度条(ProgressBar)是UI界面组件,用于显示一个耗时操作它可以显示百分比,可以动态的显示进度,避免是用户觉得系统长时间未反应,提高用户的体验。在录音控件中显的尤为重要它可以显示输入音频电平大小,输出音频电平大小,各通道电平显示。在录音软件中起到不可替代的作用笔者使用ProgressBar作为显示电平大小的控件并成功实现其功能最终效果下图(一)所示(最右边为MIC输入电平动态显示,左边是视频主音量电平)
在这里插入图片描述

二、 创建(ProgressBar)垂直显示界面

创建垂直显示的ProgressBar非常简单,新建一个类添加如下代码到你的新建项目中

namespace VerticalProgressB
{
    public class VerticalProgressBar : ProgressBar
    {

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.Style |= 0x04;
                return cp;
            }
        }

        private void InitializeComponent()
        {
            this.SuspendLayout();
            this.ResumeLayout(false);

        }
    }
}

添加引用把命名空间(VerticalProgressB)引用到你的项目中然后到工具箱中去找新建的VerticalProgressB在控件工具中就可以找到你新建控件如下图(二)所示
在这里插入图片描述

三、下载NAudio

3.1 NAudio作者介绍

NAudio 的作者Mark Heath是一名软件开发者,目前在英国南安普顿的NICE CTI系统公司工作。他专门从事。net开发,特别关注客户端技术和音频播放。他在http://mark-dot-net.blogspot.com上有关于音频、WPF、Silverlight和软件工程最佳实践的博客。他是CodePlex上几个开源项目的作者,其中包括NAudio,一个底层的。net音频工具包(http://www.codeplex.com/naudio)。笔者转载了Mark Heath的文章地址:(https://blog.csdn.net/weixin_43727933/article/details/113801251)

3.2 NAudio在那下载

打开你的VS 笔者用的是VS2019 点工具—>NuGet管理器—>管理解决方案的NuGet程序包如图三所示

在这里插入图片描述
在浏览中输入NAudio找到下载包下载就可以了
在这里插入图片描述

第二种方法是用命令下载,在程序包管理器控控制台输入你要找的程序包输入:install-package NAudio即可安装。如果你要指定版本可以输入:install-package NAudio -version 1.6笔者所用版本为1.6版
在这里插入图片描述
下载后VS会自动添加引用,这一点给使用者带来很大的方便,宇宙第一强编译软件一点也不假,
下载后的文件可以在你的项目文件中找到。

在这里插入图片描述

在这里插入图片描述
可以看到是一个动态连接库DLL文件。
下面展示一些 内联代码片

   private MMDevice speskDevice;
        /// <summary>
        /// 初始化MMDeviceEnumerator获取主声道音量的值然后传给 vpb_L_1.Value到 vpb_L_4.Value
        /// </summary>
        private void MMDeviceEnumeratorInit()//扬声器
        {
            MMDeviceEnumerator devEnum = new MMDeviceEnumerator();
            //Render是扬声器
            speskDevice = devEnum.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);

        }

        private void GetDevicName()//获取MIC名称
        {

            MMDeviceEnumerator devEnum = new MMDeviceEnumerator();
            //var deviceCollection = devEnum.EnumerateAudioEndPoints(DataFlow.All, DeviceState.All);
            //Capture是捕获Mic
            MMDeviceCollection deviceCollection = 		devEnum.EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.Active);
            combox_Mic_1.Items.AddRange(deviceCollection.ToArray());
            combox_Mic_2.Items.AddRange(deviceCollection.ToArray());
            combox_Mic_3.Items.AddRange(deviceCollection.ToArray());
            combox_Mic_4.Items.AddRange(deviceCollection.ToArray());

            /*for (int i = 0; i < WaveIn.DeviceCount; i++)
            {
                WaveInCapabilities deviceInfo = WaveIn.GetCapabilities(i);
                foreach (MMDevice de in deviceCollection)
                {
                    if (de.FriendlyName.StartsWith(deviceInfo.ProductName))
                    {
                        // comboBox_Mic_1 .Items.AddRange(device.ToArray())
                        _ = combox_Mic_1.Items.Add(de.FriendlyName);
                        break;
                    }
                }
            }*/

        }
        private IWaveIn waveIn;
        /// <summary>
        /// 开始采集Mic
        /// </summary>
        private void StartRecording()
        {
            if (waveIn != null)
            {
                return;
            }

            waveIn = new WaveIn { WaveFormat = new WaveFormat(8000, 1) };//设置采样率, 8 kHz
            waveIn.DataAvailable += WaveIn_DataAvailable;//添加事件
            waveIn.StartRecording();
        }
        private int MicValue;//此变量被ProgressBar调用
        private void WaveIn_DataAvailable(object sender, WaveInEventArgs e)
        {
           short s = BitConverter.ToInt16(e.Buffer, 0);
            MicValue = Math.Abs(s / 50);
            if (MicValue >= 200)
            {
                MicValue = 200;
            }

        }



添加以下内容
上次编辑完后忘记要把时钟加上如果不加时钟垂直滚动条(VerticalProgressBar)不动动态显示 本次加上忘记的内容

在Form窗口添加一个时钟起名叫(timer_Mic)
在这里插入图片描述

timer_Mic属性设置如下图所示
在这里插入图片描述
记得要把Enabled设置为True 笔者曾一度忘记将时钟使能,结果看不到麦克风的变化。在这里特意叮嘱一下
设置时钟事件
下面展示一些 内联代码片

 private void Timer_Mic_Tick(object sender, EventArgs e)
        {
            MMDeviceEnumeratorInit();//扬声器
            vpb_Voice_L.Value = Convert.ToInt32(speskDevice.AudioMeterInformation.MasterPeakValue * 200.0f);//speskDevice
            //vlc_vlcControl1.Audio.Volume = tbr_Volume_1.Value;//音量条TrackBar初设为100现改为200
            if (combox_Mic.SelectedItem != null)
            {
                //MIC音量
                StartRecording();//开始录音如果没有这一条VerticalProgressBar就没有动态显示
                MMDevice device = (MMDevice)combox_Mic.SelectedItem;
                if (device != null && MicOnOff_1)//如果为真
                {
                    //MIC音量电平
                    //vpb_L_1.Value = MicValue;
                    vpb_Voice_R.Value = MicValue;

                }
            }
        }

MicOnOff_1 是BOOL类型变量。如果要设置静音可以起用此变量,这要看你的程序要求而定。如果看到此文对你有帮助给点个赞谢谢!

  • 0
    点赞
  • 6
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

杏雨1969

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值