首页 > 编程语言 >c#中使用NAudio

c#中使用NAudio

时间:2023-05-27 11:32:17浏览次数:48  
标签:c# mWavWriter DataAvailable 录音 WaveFileWriter 使用 mWavIn NAudio 音频

在网上找了很多类似录音教程效果都不好,或根本不能录音,代码由网上借鉴修改(完整实现录音播放功能)

NAudio

NAudio为.NET平台下的开源库,采用ML-PL协议,开源地址:https://github.com/naudio/NAudio。

NAudio功能强大,且其入门容易。 强大在于:它支持许多音频操作,可实现多种API播放与录制、多种不同音频格式、音频格式转换(重采样、位深、声道等)、音频编码、多通道播放、音频效果处理等等(详细介绍可以看Github readme)。

基本使用

基本代码示例

// 创建WaveIn实例 它将用于录制音频。你可以指定音频的采样率、通道数和位深度。
var waveIn = new WaveIn();

// 设置录音参数
waveIn.WaveFormat = new WaveFormat(44100, 16, 1);

// 设置录音事件处理函数
waveIn.DataAvailable += OnDataAvailable;

// 创建WaveFileWriter实例 它将用于将录制的音频写入文件
var writer = new WaveFileWriter("output.wav", waveIn.WaveFormat);

// 开始录音
waveIn.StartRecording();

// 停止录音
waveIn.StopRecording();
writer.Close();

// 录音事件处理函数
private void OnDataAvailable(object sender, WaveInEventArgs e)
{
    writer.Write(e.Buffer, 0, e.BytesRecorded);
}

实例

新建一个类

RecordController.cs

public class RecordController
{
  public WaveIn mWavIn;
  public WaveFileWriter mWavWriter;
  /// <summary>
  /// 开始录音
  /// </summary>
  /// <param name="filePath">录音文件路径</param>
  public void StartRecord(string filePath)
    {
      //录音文件路径
      mWavIn = new WaveIn();
      // 添加DataAvailable事件处理程序
      mWavIn.DataAvailable += MWavIn_DataAvailable;
      // mWavIn.RecordingStopped += MWavIn_RecordingStopped; 有冲突
      // 创建WaveFileWriter对象
      mWavWriter = new WaveFileWriter(filePath, mWavIn.WaveFormat);
      // 开始录音
      mWavIn.StartRecording();
    }
    /// <summary>
    /// 停止录音
    /// </summary>
  public void StopRecord()
    {
      // 停止录音
      mWavIn ? .StopRecording();
      // 释放WaveIn对象
      mWavIn ? .Dispose();
      mWavIn = null;
      // 关闭WaveFileWriter对象
      mWavWriter ? .Close();
      mWavWriter = null;
    }
    // 这个方法在调用关闭时会有冲突,暂时注释掉
    //private void MWavIn_RecordingStopped(object sender, StoppedEventArgs e)
    //{
    //    mWavIn?.Dispose();
    //    mWavIn = null;
    //    mWavWriter?.Close();
    //    mWavWriter = null;
    //}
    /// <summary>
    /// DataAvailable事件处理程序
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
  private void MWavIn_DataAvailable(object sender, WaveInEventArgs e)
  {
    // 写入录音数据
    mWavWriter.Write(e.Buffer, 0, e.BytesRecorded);
    // 计算已录制的秒数
    int secondsRecorded = (int) mWavWriter.Length / mWavWriter.WaveFormat.AverageBytesPerSecond;
  }
}

在StartRecord方法中,创建了WaveIn对象和WaveFileWriter对象,分别用于录制音频数据和将音频数据写入文件。添加了DataAvailable事件处理程序,用于在录音过程中将音频数据写入文件。在StopRecord方法中,停止录音并释放WaveIn对象和WaveFileWriter对象。

在MWavIn_DataAvailable方法中,将音频数据写入文件,并计算已录制的秒数。注释中说明了MWavIn_RecordingStopped方法存在冲突,暂时注释掉了该方法

方法调用

RecordController record = new RecordController();
/// <summary>
/// 测试
/// </summary>
/// <param name="i"></param>
public void Sidetone(int i)
{
  // 获取ListView中的行
  string[] row = getlistviewitem(i);
  // 开始录音
  record.StartRecord("e:\rec.wav");
    
  // 如果用户选择不播放录音,则停止录音并将错误标志设置为false
  if(MessageBox.Show("正在录音,点击是播放录音", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.No)
  {
    record.StopRecord();
    ErrorFlag = false;
    row[6] = "FAIL";
  }
  else
  {
    // 停止录音并播放录音
    record.StopRecord();
    string path = "e:\rec.wav";
    //.wav音频文件路径
    System.Media.SoundPlayer player = new System.Media.SoundPlayer(path);
    player.Play();
      
    // 如果用户选择没有录音,则将错误标志设置为false
    if(MessageBox.Show("是否有录音", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.No)
    {
      ErrorFlag = false;
      row[6] = "FAIL";
    }
    else
    {
      // 如果用户选择有录音,则将错误标志设置为true,并将行的第5列设置为“OK”,第6列设置为“PASS”
      ErrorFlag = true;
      row[5] = "OK";
      row[6] = "PASS";
    }
  }
  // 更新ListView中的行
  listupdate(row, i);
}

Sidetone的函数,它接受一个整数参数i,用于录音并播放录音,然后根据用户的响应更新ListView控件中指定索引位置的行数据。

标签:c#,mWavWriter,DataAvailable,录音,WaveFileWriter,使用,mWavIn,NAudio,音频
From: https://blog.51cto.com/u_12828212/6361630

相关文章

  • RoCE多网卡时,报文可以过去,但是回不来
    摘要:虽然网卡是接入RoCE网络,但其实问题本身是单纯路由相关的,所以看的时候,不用关注RoCE,只当做一个独立子网就行了本文分享自华为云社区《<跟唐老师学习云网络>-RoCE多网卡时,报文可以过去,但是回不来》,作者:tsjsdbd。一、网络概要一台机子,接入2个子网,一个普通通信的,一个高速通信的......
  • 关于oracleJdk连接maven产生ssl验证问题
    问题:failedtotransferfromhttps://repo.maven.apache.org/maven2/duringapreviousattempt这是因为oraclejdk1.8存在ssl验证问题添加以下信息到idea的maven当中即可-Dmaven.wagon.http.ssl.insecure=true-Dmaven.wagon.http.ssl.allowall=true-Dmaven.wagon......
  • MapStructPlus 1.2.5 发布,新增 Solon 支持
    MapStructPlus1.2.5发布,更新内容如下:fix:解决MapConvertMapperAdapter编译警告问题feat:增加nullValueMappingStrategy和nullValuePropertyMappingStrategy配置项feat:适配solon主要更新内容为适配Solon,使用方式基本等同于SpringBoot环境下的使用方式。与其......
  • ubuntu server 20.4设置使用root登录
    ubuntu@ubuntu:~$sudopasswdrootNewpassword:Retypenewpassword:passwd:passwordupdatedsuccessfullyubuntu@ubuntu:~$suroot#切换到root账户Password:root@ubuntu:/home/ubuntu#使用vim/etc/ssh/sshd_config编辑配置文件找到#PermitRootLoginprohib......
  • 在Directory.Build.props中用全局变量来管理包的版本号
    1、顶级目录下放置Directory.Build.props文件为每个软件产品,分配一块独立的windows盘符,在根目录下放置名为Directory.Build.props的文件即可。这个文件名是特定的,必须叫这个。如果公司有很多产品,引用的同一个包的版本可能是不同的,那么在磁盘根目录下就不要有Directory.Build.props......
  • Python_手动下载Chrome驱动找不到对应版本,尝试pip自动下载对应版本的驱动,问题解决
    pipinstallwebdriver-manager 验证是否成功代码如下:fromseleniumimportwebdriverdriver=webdriver.Chrome()url='https://www.csdn.net/'driver.get(url)driver.maximize_window()验证成功......
  • 第一个react.js程序:create and show comment
    importReact,{Component}from"react";import{render}from"react-dom";importPropTypesfrom"prop-types";constnode=document.getElementById("root");constdata={post:{id:123,content:......
  • ASP.NET MVC WebAPI Put和Delete请求出现405(Method not allowed)错误
    解决办法:在站点根目录下的web.config设置如下(主要参考添加项):<system.webServer></system.webServer>(End)转自:https://www.bbsmax.com/A/qVdepEM85P/......
  • js原型prototype(实例构造函数的属性) __proto__(实例对象的属性) constructor(实例
    functionPerson(name,age){this.name=namethis.age=age}Person.prototype.sayHi=function(){//原型是公共方法解决构造函数new对象公共属性和方法的内存浪费console.log(this.name+'sayhi!!')}constp1=newPerson('aa',12)constp2=new......
  • nvm安装多版本node,vscode不识别npm函数解决方案
    问题:npm:无法将“npm”项识别为cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次的解决方案解决办法:(首先确定cmd当中是能够正常显示node和npm版本问题) 1、第一种办法:设置管理员权限 2、第二种办法:在Vscode......