首页 > 编程语言 >C#使用NAudio录音,并导出录音数据

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

时间:2024-03-14 15:34:46浏览次数:17  
标签:C# NAudio System 录音 waveIn int new 数据

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

1、使用Vs2019的Nuget包管理器安装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,System,录音,waveIn,int,new,数据
From: https://blog.csdn.net/rbigbearr/article/details/136677919

相关文章

  • CocoaPod 如何创建私有库
    一github新建仓库点击Newrepository,然后配置仓库属性   Createanewrepository       创建完成自己的github远程项目。打开终端,cd~/.cocoapods/repos目录下执行podrepoaddNAME(自定义项目名称,可以和远端不一致)https://自己生成的token@gith......
  • 2024-03 STEMA 考试C++ 中级真题解析
    2024-03-10STEMA考试C++中级真题解析一、选择题(50分)1、    (110010)2+(c3)16的结果是(B )。A.(240)10        B.(11110101)2        C.(366)8        D.(f6)16备注:此题目下标代表进制,因不支持md格式。  2、   表达式1000/3的结果是(......
  • OCS2 例程代码解析- Quadrotor
    一、ocs2_quadrotorSTATE_DIM=12;INPUT_DIM=4;state:位置、角度、位置导数、角速度、input:Fz,Mx.My,Mz1、QuadrotorInterface.h定义一个类QuadrotorInterface,作用:QuadrotorInterface(conststd::string&taskFile,conststd::string&libraryFolder);构造函数,接受......
  • 用JavaSocket编程开发聊天室
    1.设计内容1.用Java图形用户界面编写聊天室服务器端和客户端,支持多个客户端连接到一个服务器。每个客户端能够输入账号。2.可以实现群聊(聊天记录显示在所有客户端界面)。3.完成好友列表在各个客户端上显示。4.可以实现私人聊天,用户可以选择某个其他用户,单独发送信息。......
  • [USACO | Python] 201602B2 Circular Barn
    作为当代建筑的粉丝,农民约翰(John)建造了一个完美圆形的新谷仓。在里面,谷仓由n环组成房间,从1…n的顺时针方向编号。房间的有n个(1<=n<=1000)。每一间房间都有三扇门,两扇分别通往临近的房间,一扇通往谷仓的外面。FarmerJohn想要有准确的ri头牛在房间r中(1<=ri<=100),他......
  • 模板匹配——create_shape_model
    Theoperatorcreate_shape_modelpreparesatemplate,whichispassedintheimageTemplate,asashapemodelusedformatching.TheROIofthemodelispassedasthedomainofTemplate.运算符create_shape_model准备一个模板,该模板在图像模板中传递,作为用于匹配的......
  • 滴水逆向笔记系列-c语言总结6-20.多级指针 数组指针 函数指针-21.位运算-22.内存分配
    第二十课c语言13多级指针数组指针函数指针1.多级指针反汇编一二级指针可以看到p1==*(p1+0)==p1[0]本来一直没想懂为什么是movsxecx,byteptr[eax],是byte,才发现p1是char类型,所以才得用movsx拓展(p1+2)==p1[2],指针可以用和[]取值,他们是一样的(((p3+1)+2)+3)==p3[......
  • mybatis plus saveBatch报错问题
    sessionRecordHumanService.saveBatch(dataList);具体报错如下:org.mybatis.spring.MyBatisSystemException:nestedexceptionisorg.apache.ibatis.exceptions.PersistenceException: ###Errorupdatingdatabase.Cause:java.lang.IllegalArgumentException:MappedSta......
  • TCP协议
    TCP协议TCP协议的头部为20ByteTCP头部的数据格式端口号:各占2个字节,端口号与IP首部中的源端IP地址和目的端IIP地址唯一确定一个TCP连接。序号:占4字节,整个要传送的字节流的起始序号必须在连接建立时设置确认号:占4字节,是期望收到对方下一个报文段的第一个数据字节......
  • 617. 合并二叉树c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*/structTreeNode*mergeTrees(structTreeNode*root1,structTreeNode*root2){if(!root1&&!roo......