c# NAudio 采集麦克风电平并显示在progressBar 2021-02-16
发布日期:2021-05-10 23:37:17 浏览次数:27 分类:精选文章

本文共 4113 字,大约阅读时间需要 13 分钟。

一、写在前面

进度条(ProgressBar)是UI界面组件,用于显示一个耗时操作的进度。通过动态显示百分比,避免用户等待感。在录音控件中,特别是在音频处理应用中,显示音频电平信息尤为重要。笔者使用ProgressBar显示麦克风电平并实现了动态更新,最终效果如附图所示(麦克风电平动态显示为最右边,主音量电平为左侧)。

二、创建垂直显示的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)引用到项目中即可实现水平或垂直处显示,根据需求选择。

附图二展示了垂直进度条在控制面板的使用情况。

三、使用NAudio库

3.1 了解NAudio作者

NAudio是由Mark Heath开发的开源C#音频处理库,主要用于多媒体编码、播放和录音。Mark Heath位于英国南安普顿的NICE CTI系统公司,专注于.NET开发,尤其是客户端技术和音频处理。

3.2 安装NAudio

通过NuGet管理器安装NAudio:

  • 右键点击项目根目录,选择“NuGet管理器”。
  • 刚拖动“管理解决方案的NuGet程序包”对话框。
  • 搜索“NAudio”,选择合适版本(如1.6)并安装。安装完成后,NAudio及相关组件会自动引用到项目中。

3.3 获得麦克风电平信息

以下代码示例展示了如何在NAudio中获取麦克风设备信息并获取电平值:

private MMDevice speskDevice;  // 初始化麦克风设备  
private void MMDeviceEnumeratorInit()
{
MMDeviceEnumerator devEnum = new MMDeviceEnumerator();
speskDevice = devEnum.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
}
private void GetDevicName()
{
MMDeviceCollection deviceCollection = devEnum.EnumerateAudioEndPoints(DataFlow.Capture, DeviceState.Active);
combobox_Mic_1.Items.AddRange(deviceCollection.ToArray());
// 其他麦克风设备类似处理
}
private IWaveIn waveIn;
private void StartRecording()
{
if (waveIn != null) return;
var format = new WaveFormat(8000, 1); // 8kHz单声频,1位深度
waveIn = new WaveIn { WaveFormat = format };
waveIn.DataAvailable += WaveIn_DataAvailable;
waveIn.StartRecording();
}
private int MicValue;
private void WaveIn_DataAvailable(object sender, WaveInEventArgs e)
{
short s = BitConverter.ToInt16(e.Buffer, 0);
MicValue = Math.Abs((int)s / 50); // 转换电平值为百分比
if (MicValue >= 200) MicValue = 200;
}
// 定时刷新电平值
private void Timer_Mic_Tick(object sender, EventArgs e)
{
MMDeviceEnumeratorInit();
if (combox_Mic.SelectedItem != null && MicOnOff_1)
{
var device = (MMDevice)combox_Mic.SelectedItem;
vpb_Voice_R.Value = MicValue;
}
}
// 定时器设置
private System.Threading.Timer timer;
public bool MicOnOff_1 = true; // 用于控制是否显示电平值
public VerticalProgressBar.verticalProgressBar verticalProgressBar;
// 初始化定时器
timer = new Timer(1000);
timer.Enabled = true;
timer.Tick += Timer_Mic_Tick;
// 开始采集麦克风信号
StartRecording();

3.4 进度条设置与显示

更新进度条时,可以为每个通道设定不同的值。例如,此代码设定主音量为左侧进度条:

// 设定主音量条为左侧  
this.tbr_Voice_L.Location = new System.Windows.Forms.Point(10, 10);

3.5 注意事项

  • 正则引用:确保所有组件在设计时已拖动到_form.sharp中。
  • 自动维护:在Dispose事件中确保清理资源。
  • 特殊情况:当麦克风被静音或断开时,值为0。

3.6 示例代码片段

以下示例代码展示了如何在_form.cs中实现麦克风电平显示:

using System;  
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using NAudio;
namespace VerticalProgressB {
public partial class Form1 : Form
{
private VerticalProgressBar verticalProgressBar;
private IWaveIn waveIn;
// 其他字段如命名空间请根据实际需求添加
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// 使用 VerticalProgressB 命名空间中的 VerticalProgressBar
verticalProgressBar = new VerticalProgressBar();
// 设置进度条位置和样式
// 初始化麦克风设备
MMDeviceEnumerator devEnum = new MMDeviceEnumerator();
speskDevice = devEnum.GetDefaultAudioEndpoint(DataFlow Render, Role.Multimedia);
}
// 其他事件不需要改动,已默认处理
protected override void Dispose(params object[] array)
{
if (components != null) components.Dispose();
base.Dispose(array);
}
}
}

三、下载与引用

通过上述步骤,你可以轻松完成NAudio的下载与集成。当你完成以上代码,DWORD值的确切数值取决于你的麦克风电平设置。对于更高级的录音或多音轨处理,将需要更多的NAudio功能。希望你在项目中有一个愉快的体验!

上一篇:FFmpeg获取DirectShow设备数据4.3.2版不在有乱码)
下一篇:C#两种进程暂停和继续的方法 2021-02-16

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月13日 01时12分30秒