一、枚举电脑录音设备,指定设备录音
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录音并导出录音数据的文章就介绍到这了,更多相关c# naudio录音内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论