C#实现电脑麦克风录音

下面是“C#实现电脑麦克风录音”的完整攻略:

准备工作:

  1. C#编程环境,可以使用Visual Studio或者JetBrains Rider等开发工具。
  2. NAudio库,它是一个开源的音频处理库,可以在NuGet中进行安装。

实现步骤:

步骤1:初始化录音设备

我们需要调用System.Windows.Forms的API来检查电脑中可用的录音设备,然后选择合适的录音设备进行初始化。下面是代码示例:

using NAudio.Wave;

var waveInDevices = WaveIn.DeviceCount;
for (var i = 0; i < waveInDevices; i++)
{
    var deviceInfo = WaveIn.GetCapabilities(i);
    Console.WriteLine($"{i}: {deviceInfo.ProductName}");
}

输出的结果将会是这样的:

0: 麦克风 (Realtek High Definition Audio)
1: 麦克 (Steam Streaming Microphone)

这里我们选择使用第一个设备(即 Realtek High Definition Audio 麦克风)进行录音。

步骤2:开始录音

当我们初始化好录音设备之后,就可以开启录音了。我们可以通过调用WaveInStartRecording()方法来启动录音。下面是代码示例:

var waveIn = new WaveInEvent
{
    DeviceNumber = 0,
    WaveFormat = new WaveFormat(44100, WaveIn.GetCapabilities(0).Channels)
};
waveIn.DataAvailable += waveIn_DataAvailable;
waveIn.StartRecording();

在这段代码中,我们使用WaveInEvent类来启动录音,DeviceNumber = 0表示选择第一个设备进行录音,WaveFormat则表示录音的采样率和频道数。

同时,我们需要为录音准备一个数据缓冲区,并将录音时的数据存储到这个缓冲区中。因此,我们需要为waveIn对象添加一个DataAvailable事件的监听器:

private static readonly List<byte> _recordedRawData = new List<byte>();

private static void waveIn_DataAvailable(object sender, WaveInEventArgs e)
{
    _recordedRawData.AddRange(e.Buffer.Take(e.BytesRecorded));
}

在该函数中,我们使用一个名为_recordedRawData的静态变量来存储录音得到的原始数据。

步骤3:结束录音并生成音频文件

当我们需要结束录音后,我们可以调用waveInStopRecording()方法,停止录音。然后我们需要将得到的原始数据进行处理,生成一个WAV格式的音频文件。下面是代码示例:

waveIn.StopRecording();

var audioData = _recordedRawData.ToArray();
using (var waveWriter = new WaveFileWriter("output.wav", waveIn.WaveFormat))
{
    waveWriter.Write(audioData, 0, audioData.Length);
}

在这段代码中,我们使用WaveFileWriter来生成WAV格式的音频文件,并将原始数据写入到文件中。

示例1: 录制5秒钟的音频文件

在这个例子中,我们将录制5秒钟的音频文件。

using NAudio.Wave;

static void Main(string[] args)
{
    Console.WriteLine("Press any key to start recording ...");
    Console.ReadKey();

    using (var waveIn = new WaveInEvent
    {
        DeviceNumber = 0,
        WaveFormat = new WaveFormat(44100, WaveIn.GetCapabilities(0).Channels)
    })
    {
        var recordedData = new List<byte>();
        waveIn.DataAvailable += (sender, e) => recordedData.AddRange(e.Buffer.Take(e.BytesRecorded));
        waveIn.StartRecording();
        Task.Delay(5000).Wait();
        waveIn.StopRecording();

        var audioData = recordedData.ToArray();
        using (var waveWriter = new WaveFileWriter("output.wav", waveIn.WaveFormat))
        {
            waveWriter.Write(audioData, 0, audioData.Length);
        }
    }

    Console.WriteLine("Recording is complete! Press any key to exit ...");
    Console.ReadKey();
}

示例2: 实时输出声波

在这个例子中,我们将用一个控制台应用程序来实现实时输出麦克风的声波。

using NAudio.Wave;

static void Main(string[] args)
{
    const int sampleRate = 44100;
    const int channelCount = 1;

    using (var stream = new WaveInEvent
    {
        DeviceNumber = 0,
        WaveFormat = new WaveFormat(sampleRate, channelCount)
    }.ToSampleProvider())
    {
        var soundOut = new WasapiOut();

        soundOut.Init(() => stream);

        soundOut.Play();

        var soundPlot = new SoundPlot();
        soundPlot.Play(stream);
    }

    Console.ReadLine();
}

class SoundPlot
{
    public void Play(ISampleProvider source)
    {
        const int width = 100;
        const int height = 25;

        var soundData = new float[width];

        var watch = Stopwatch.StartNew();

        source.Read(soundData, 0, width);

        while (true)
        {
            for (var i = 0; i < soundData.Length - 1; i++)
            {
                soundData[i] = soundData[i + 1];
            }
            source.Read(soundData, soundData.Length - 1, 1);

            Console.Clear();
            for (var y = 0; y < height; y++)
            {
                var amplitude = (float)y / height * 2.0f - 1.0f;
                for (var x = 0; x < soundData.Length; x++)
                {
                    var xMin = (float)x / soundData.Length;
                    var xMax = (float)(x + 1) / soundData.Length;
                    if (soundData[x] >= amplitude)
                    {
                        Console.BackgroundColor = ConsoleColor.DarkRed;
                    }
                    else
                    {
                        Console.BackgroundColor = ConsoleColor.Black;
                    }
                    Console.Write(" ");
                }
                Console.BackgroundColor = ConsoleColor.Black;
                Console.WriteLine();
            }

            Thread.Sleep(10);
        }
    }
}

这段代码中,我们用WaveInEvent来初始化录音设备,并将其转换成ISampleProvider接口类型。ISampleProvider代表一系列音频数据,可以被使用Read()方法进行读取。

然后我们使用SoundPlot类来输出实时的音频数据。在SoundPlot类中,我们先读取一段音频数据,并存储到一个名为soundData的数组中。

var soundData = new float[width];

source.Read(soundData, 0, width);

然后,在一个大循环中,我们首先将soundData中的所有数据向左移动一个位置,再从接口中读取最后一个新数据,并将其插入到soundData数组的最后一个位置。

for (var i = 0; i < soundData.Length - 1; i++)
{
    soundData[i] = soundData[i + 1];
}
source.Read(soundData, soundData.Length - 1, 1);

接下来,我们用Console类来输出声波图形。在Console的输出中,我们可以使用颜色区分不同的音量级。

if (soundData[x] >= amplitude)
{
    Console.BackgroundColor = ConsoleColor.DarkRed;
}
else
{
    Console.BackgroundColor = ConsoleColor.Black;
}
Console.Write(" ");

最后,循环执行并持续输出声波图形。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#实现电脑麦克风录音 - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • C#中的那些常用加密算法

    当涉及到信息安全时,加密是必不可少的一个环节。在C#中,有许多不同的加密算法,如对称加密算法(如DES、3DES、AES)、非对称加密算法(如RSA)、摘要算法(如MD5、SHA256)等等。接下来我们分别探究这些算法的使用方法。 对称加密算法 对称加密算法使用同一把密钥用于加密和解密信息。因此,密钥的保护尤为重要。 DES加密算法 DES全称为数据加密标准…

    C# 2023年6月6日
    00
  • ASP.Net Core中使用枚举类而不是枚举的方法

    ASP.Net Core是一个开源的Web应用程序框架,支持多种操作系统和平台。其中使用枚举类而不是枚举的方法,可以使代码更加可读,可维护和可扩展。 1.枚举类的定义 在ASP.Net Core中定义枚举类可以使用如下方法: public class CardSuit { public const int Hearts = 0; public const i…

    C# 2023年6月6日
    00
  • 利用VS2019创建Web项目并发送到IIS及IIS与ASP.NET配置教程

    下面给你讲解如何利用VS2019创建Web项目并发送到IIS以及IIS与ASP.NET配置教程。 利用VS2019创建Web项目 打开Visual Studio 2019,选择新建项目。 在弹出的新建项目窗口的左下角选择Web,选择ASP.NET Web 应用程序,并选择.Net Framework的版本。 在新建项目窗口的中间,您可以选择Web程序类型,选…

    C# 2023年5月15日
    00
  • C#中ref和out的区别浅析

    C#中ref和out的区别浅析 简介 在C#中,关键字ref和out用于传递参数。尽管两个关键字都可以使用相同的参数来传递值,但它们在应用和使用上还是有一些区别,下面进行一一讲解。 ref关键字 ref关键字用于将参数传递给函数并且函数可以修改传递的参数,同时最初传递的参数也会被修改。这里要注意的是,在使用ref关键字时,必须要在通过ref来初始化变量(即在…

    C# 2023年5月15日
    00
  • C#实现归并排序

    下面是“C#实现归并排序”的完整攻略。 什么是归并排序 归并排序是一种基于“分治”思想的排序算法。该算法将待排数组递归地分成两部分,分别进行排序,最后合并成有序序列。 归并排序的步骤 拆分:将待排数组递归地拆分成左右两个子数组,直到每个子数组只有一个元素。 排序:将左右子数组分别进行排序,排序完成后合并。 合并:合并左右两个有序子数组为一个有序数组。 C#实…

    C# 2023年6月7日
    00
  • C# winfrom 模拟ftp文件管理实现代码

    为实现C# WinForm中FTP文件管理,需要通过FTP协议连接到FTP服务器,并进行文件的上传、下载、删除和重命名等操作。这里提供一份完整攻略,包括相关API的使用和示例代码的实现。 连接FTP服务器 C# WinForm最常使用的.NET类库是System.Net,其中有一个FtpWebRequest类可以用于创建FTP请求,实现对FTP服务器的连接。…

    C# 2023年6月1日
    00
  • C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaOb的应用(上)

    那我开始讲解C# Dynamic之:ExpandoObject,DynamicObject,DynamicMetaObject的应用(上)的完整攻略。 1. 概述 首先,需要了解什么是动态类型,以及为什么需要使用动态类型。在C#中,变量的类型实际上是由编译器推断出来的,也就是静态类型。而动态类型是指在运行时才确定类型的类型。动态类型的主要作用是在不确定类型时…

    C# 2023年5月31日
    00
  • c#读写App.config,ConfigurationManager.AppSettings 不生效的解决方法

    针对 “c#读写App.config,ConfigurationManager.AppSettings不生效的解决方法” 这个问题,我们可以从以下几个方面入手: 1. 确认App.config格式是否正确 在使用App.config的时候,我们需要确保这个文件名及格式都是正确的,这是一个很容易被忽略的问题。首先,确认你的App.config文件是放在程序的根…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部