广告位联系
返回顶部
分享到

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

C#教程 来源:互联网 作者:佚名 发布时间:2024-12-24 22:36:01 人浏览
摘要

一、枚举电脑录音设备,指定设备录音 1、使用Vs2019的Nuget包管理器安装NAudio包 NAudio包 如图所示: 2、创建录音对象并指定录音格式 1 2 3 4 5 6 // 录音对象 WaveInEvent waveIn = new WaveInEvent(); int samp

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

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

NAudio包

如图所示:

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

1

2

3

4

5

6

// 录音对象

WaveInEvent waveIn = new WaveInEvent();

int sampleRate = 48000;   //采样率

int channels = 2;          //录音通道数

int bitsPerSample = 16;     //位深

WaveFormat waveFormat = new WaveFormat(sampleRate, bitsPerSample, channels);

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

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这个回调函数中处理即可。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

// 创建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代码如下:

1

2

3

4

5

6

7

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文件

四、完整代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

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();

  

        }

    }

}


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • C#使用录音并导出录音数据

    C#使用录音并导出录音数据
    一、枚举电脑录音设备,指定设备录音 1、使用Vs2019的Nuget包管理器安装NAudio包 NAudio包 如图所示: 2、创建录音对象并指定录音格式 1 2 3 4
  • C#播放short或者byte类型的音频

    C#播放short或者byte类型的音频
    一、通过Nuget安装NAudio包 开发工具:vs2019 点击VisualStudio 2019的工具-NuGet包管理器-》管理解决方案的NuGet的程序包-》浏览-》在搜索框中输入
  • C# winfrom异步加载数据不影响窗体UI的操作方法
    在数字浪潮汹涌澎湃的时代,程序开发宛如一座神秘而宏伟的魔法城堡,矗立在科技的浩瀚星空中。代码的字符,似那闪烁的星辰,按照特
  • 使用C#实现AES加密与解密
    1. AES 加密简介 AES(Advanced Encryption Standard,高级加密标准)是一种对称加密算法,意味着加密和解密使用相同的密钥。AES 支持不同的密钥长
  • 在idea中利用maven实现多环境配置自动打包的流程

    在idea中利用maven实现多环境配置自动打包的流程
    spring的多环境配置 spring提供了多环境配置文件的功能,只需要根据配置文件后缀即可加载对应的配置文件 1 2 3 4 spring: profiles: # 修改后缀即
  • Java实现自定义重试工具类介绍
    Spring-retry、guava的Retry都提供有重试工具,但二者均存在一个确缺点,即如果重试等待过程中会一直阻塞工作线程,这对于在生产环境使用是
  • C#中SetStyle的具体使用介绍
    在C#的Windows Forms应用程序中,SetStyle方法是Control类的一个成员,用于启用或禁用特定的控件样式。这些样式控制控件的不同行为和外观。以
  • C# WinForm实现画笔签名功能介绍

    C# WinForm实现画笔签名功能介绍
    实现效果 签名功能的显示界面如下图: 该效果主要实现如下功能: 1、提供画布,设计画笔类,实现画笔签名 2、点击重签按钮清空画布
  • C#文字识别API场景解析、表格识别提取功能实现
    在快节奏的工作与生活环境中,如何提高企业工作效率、提升用户体验成为了人们追求的共同目标。针对市场发展需求,一种将任意场景图
  • c#线性回归和多项式拟合示例详解
    1. 线性回归 公式:线性回归的目标是拟合一条直线,形式为: y=mx+by=mx+b 其中: yy是因变量(目标值) xx是自变量(特征值) mm是斜率(s
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计