C#使用NAudio录音并导出录音数据

 更新时间:2024年12月23日 15:11:26   作者:rbigbearr  
这篇文章主要为大家详细介绍了C#如何使用NAudio实现录音功能并导出录音数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

一、枚举电脑录音设备,指定设备录音

1、使用Vs2019的Nuget包管理器安装NAudio包

NAudio包

如图所示:

2、创建录音对象并指定录音格式

// 录音对象
WaveInEvent waveIn = new WaveInEvent();
int sampleRate = 48000;   //采样率
int channels = 2;          //录音通道数
int bitsPerSample = 16;     //位深
WaveFormat waveFormat = new WaveFormat(sampleRate, bitsPerSample, channels); 

录音格式最好和自己电脑一样,我的电脑格式如下:

3、枚举电脑的可用录音设备,并指定

string RecordDeviceName = "麦克风阵列"; //指定麦克风阵列录制
//枚举可用录音设备
for (int i = 0; i < WaveIn.DeviceCount; i++)
{
    var capabilities = WaveIn.GetCapabilities(i);
    Console.WriteLine("DeviceIndex:{0},ProduceName:{1}", i, capabilities.ProductName);
    if (capabilities.ProductName.StartsWith(RecordDeviceName))
    {
        Console.WriteLine("找到指定设备:{0}", RecordDeviceName);
        waveIn.DeviceNumber = i;    //设置该设备为录音设备
    }
}
waveIn.WaveFormat = waveFormat;   //设置录音格式

运行之后枚举的效果如下:

二、获取录音数据

录音数据主要是从waveIn.DataAvailable中获取,我保存了两种形式,一种是将录音直接生成wav文件,另一种是将byte类型的录音数据变换short数据导出到txt中。假如需要对录音数据进行实时处理就直接在DataAvailable这个回调函数中处理即可。

// 创建WaveFileWriter对象来保存录音数据  路径在bin文件下
WaveFileWriter writer = new WaveFileWriter("recorded.wav", waveFormat);
//编写器
StreamWriter mStreamWriter = new StreamWriter("Record.txt", false, new System.Text.UTF8Encoding(false));
// 设置录音回调函数
int bitIndex = bitsPerSample / 8;
waveIn.DataAvailable += (sender, e) =>
{
    // 将录音数据写入文件
    writer.Write(e.Buffer, 0, e.BytesRecorded);
 
    for (int i = 0; i < e.BytesRecorded/ bitIndex; i++)
    {
        //24bit,导出的数据
        //int sample = (int)((e.Buffer[i * bitIndex + 2] << 16) | (e.Buffer[i * bitIndex + 1] << 8) | e.Buffer[i * bitIndex]);
        //16bit  将两个byte数据组合成一个short数据
        short sample = (short)((e.Buffer[i * bitIndex + 1] << 8) | e.Buffer[i * bitIndex]);
        mStreamWriter.Write("{0},", sample);
    }               
};
try
{
    //尝试打开录音设备,如果设备支持设置的WaveFormat,则能够成功打开
    waveIn.StartRecording();              
    Console.WriteLine("开始录音");
}
catch (Exception ex)
{
    Console.WriteLine($"错误信息:{ex.Message}");
}
Console.WriteLine("请按任意键结束录音");
Console.ReadKey();
waveIn.StopRecording();  //停止录音
writer.Close(); 
mStreamWriter.Close();
waveIn.Dispose();

三、验证录音数据

可以将txt数据导入到matlab中生成wav文件,然后使用电脑播放器播放wav文件,听一下是否录制到声音。

matlab代码如下:

clear,clc,close all;   %清除工作区变量
data=load("Record.txt");  %加载录音数据
left=data(1:2:end);    %左声道数据
right=data(2:2:end);   %右声道数据
doubleChannel=[left',right']; %组合成双声道
doubleChannel=[left',right']./max(abs(doubleChannel));  %录音数据归一化
audiowrite("test.wav",doubleChannel,48000);  %以48000采样率生成wav文件

四、完整代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NAudio.Wave;
namespace record24位
{
    class Program
    {
        static void Main(string[] args)
        {
            // 录音对象
            WaveInEvent waveIn = new WaveInEvent();
            int sampleRate = 48000;   //采样率
            int channels = 2;          //录音通道数
            int bitsPerSample = 16;     //位深
            WaveFormat waveFormat = new WaveFormat(sampleRate, bitsPerSample, channels);           
            string RecordDeviceName = "麦克风阵列";
            //枚举可用录音设备
            for (int i = 0; i < WaveIn.DeviceCount; i++)
            {
                var capabilities = WaveIn.GetCapabilities(i);
                Console.WriteLine("DeviceIndex:{0},ProduceName:{1}", i, capabilities.ProductName);
                if (capabilities.ProductName.StartsWith(RecordDeviceName))
                {
                    Console.WriteLine("找到指定设备:{0}", RecordDeviceName);
                    waveIn.DeviceNumber = i;    //设置该设备为录音设备
                }
            }
            waveIn.WaveFormat = waveFormat;   //设置录音格式
            
            // 创建WaveFileWriter对象来保存录音数据  路径在bin文件下
            WaveFileWriter writer = new WaveFileWriter("recorded.wav", waveFormat);
            //编写器
            StreamWriter mStreamWriter = new StreamWriter("Record.txt", false, new System.Text.UTF8Encoding(false));
            // 设置录音回调函数
            int bitIndex = bitsPerSample / 8;
            waveIn.DataAvailable += (sender, e) =>
            {
                // 将录音数据写入文件
                writer.Write(e.Buffer, 0, e.BytesRecorded);
 
                for (int i = 0; i < e.BytesRecorded/ bitIndex; i++)
                {
                    //24bit,导出的数据
                    //int sample = (int)((e.Buffer[i * bitIndex + 2] << 16) | (e.Buffer[i * bitIndex + 1] << 8) | e.Buffer[i * bitIndex]);
                    //16bit  将两个byte数据组合成一个short数据
                    short sample = (short)((e.Buffer[i * bitIndex + 1] << 8) | e.Buffer[i * bitIndex]);
                    mStreamWriter.Write("{0},", sample);
                }               
            };
            try
            {
                //尝试打开录音设备,如果设备支持设置的WaveFormat,则能够成功打开
                waveIn.StartRecording();              
                Console.WriteLine("开始录音");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"错误信息:{ex.Message}");
            }
            Console.WriteLine("请按任意键结束录音");
            Console.ReadKey();
            waveIn.StopRecording();  //停止录音
            writer.Close(); 
            mStreamWriter.Close();
            waveIn.Dispose();
 
        }
    }
}

到此这篇关于C#使用NAudio录音并导出录音数据的文章就介绍到这了,更多相关C# NAudio录音内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#字符串数组转换为整形数组的方法

    C#字符串数组转换为整形数组的方法

    这篇文章主要介绍了C#字符串数组转换为整形数组的方法,涉及C#数组遍历与转换的相关技巧,需要的朋友可以参考下
    2015-06-06
  • C#实现双端队列的示例代码

    C#实现双端队列的示例代码

    双端队列是一种可以在两端扩展或收缩的序列化容器,本文主要介绍了C#实现双端队列的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • C#对文件进行加密解密代码

    C#对文件进行加密解密代码

    本文给大家分享的是使用C#对文件进行加密解密的代码,十分的简单实用,有需要的小伙伴可以参考下。
    2015-07-07
  • c#委托详解和和示例分享

    c#委托详解和和示例分享

    这篇文章详细探讨了C#中的委托,列举其主要的实现方式,并分析其在设计层面和编码层面带来的好处,最后会讨论其安全性和执行效率等,当然还有实现示例
    2014-03-03
  • C# HttpClient Post参数同时上传文件的实现

    C# HttpClient Post参数同时上传文件的实现

    这篇文章主要介绍了C# HttpClient Post参数同时上传文件的实现,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • C# TabControl控件中TabPage选项卡切换时的触发事件问题

    C# TabControl控件中TabPage选项卡切换时的触发事件问题

    这篇文章主要介绍了C# TabControl控件中TabPage选项卡切换时的触发事件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • C#快速实现拖放操作

    C#快速实现拖放操作

    这篇文章介绍了C#快速实现拖放操作的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • c#并行编程示例分享

    c#并行编程示例分享

    这篇文章主要介绍了c#并行编程示例,大家直接看下面的代码吧
    2014-01-01
  • C#使用linq查询大数据集的方法

    C#使用linq查询大数据集的方法

    这篇文章主要介绍了C#使用linq查询大数据集的方法,涉及C#调用linq进行数据查询的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • C# WinForm 登录界面的图片验证码(区分大小写+不区分大小写)

    C# WinForm 登录界面的图片验证码(区分大小写+不区分大小写)

    这篇文章主要介绍了C# WinForm 登录界面的图片验证码(区分大小写+不区分大小写),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02

最新评论