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#简单遍历指定文件夹中所有文件的方法”的完整攻略。 1. 使用Directory类 我们可以使用C#内置的Directory类来实现遍历指定文件夹中所有文件的功能。具体实现步骤如下: 引用System.IO命名空间,使用Directory.GetFiles()方法获取指定文件夹中所有文件的路径。 使用foreach循环遍历获取到的文件路径,在循环体…

    C# 2023年6月1日
    00
  • sql 语句 取数据库服务器上所有数据库的名字

    要取数据库服务器上所有数据库的名字,可以使用以下 SQL 语句: SHOW DATABASES; 执行这条语句将返回一个包含所有数据库名字的列表。 示例1:获取所有数据库的名字 SHOW DATABASES; 执行结果类似于下面这样: +——————–+ | Database | +——————–+ | i…

    C# 2023年5月31日
    00
  • 如何在.NET Core应用中使用NHibernate详解

    NHibernate是一个流行的ORM框架,可以帮助我们在.NET Core应用程序中轻松地访问数据库。在本文中,我们将详细讲解如何在.NET Core应用程序中使用NHibernate的完整攻略,包括环境搭建、代码实现、示例说明等。 环境搭建 在开始使用NHibernate之前,我们需要先搭建好.NET Core应用程序的开发环境。具体来说,我们需要安装以…

    C# 2023年5月16日
    00
  • SQL语句执行超时引发网站首页访问故障问题

    问题分析 首先,我们需要检查网站首页访问故障的具体表现和报错信息。如果我们发现访问网站首页时,页面长时间无响应,或者出现“504 Gateway Timeout”之类的错误提示,那么很可能是由于SQL语句执行超时引发的故障。 其次,我们需要分析SQL语句执行超时的原因。这可能是因为SQL语句的复杂程度较高、数据库服务器负载过大,或者SQL语句本身存在性能问题…

    C# 2023年6月3日
    00
  • C#实现串口通信的示例详解

    下面我就开始详细讲解“C#实现串口通信的示例详解”的完整攻略。 总体介绍 首先我们需要了解C#实现串口通信的基本原理,即通过串口通信协议在计算机和设备之间进行数据的传输。常见的应用场景包括连接硬件设备、嵌入式系统通讯等。为了实现串口通信,需要使用C#编程实现数据的发送和接收。同时,我们还需要设置串口的各种参数,如波特率、数据位、校验位、停止位等,以确保稳定的…

    C# 2023年6月3日
    00
  • Unity相机移动之屏幕边缘检测

    针对Unity相机移动之屏幕边缘检测的完整攻略,我将为你提供详细讲解,包含以下几个部分: 屏幕边缘检测的原理 实现屏幕边缘检测的方法 两个实例说明 1. 屏幕边缘检测的原理 在Unity中,我们通过挂载脚本实现相机的移动。而要实现屏幕边缘检测,我们需要了解以下几个概念: Camera.main:获取场景中主相机对象; Camera.ViewportToWor…

    C# 2023年6月3日
    00
  • c#自定义泛型类的实现

    实现自定义泛型类的步骤如下: 定义泛型类 定义一个泛型类,可以使用 class 关键字,紧随其后的是类名和泛型参数列表。然后在类中可以使用泛型参数,类似于普通的类型。例如: public class MyGenericClass<T> { private T data; public MyGenericClass(T data) { this.d…

    C# 2023年6月7日
    00
  • C# Linq的Where()方法 – 筛选序列中满足指定条件的元素

    C# 中的 Linq(Language Integrated Query)提供了一组极具表现力的 API 以使用语言的简洁 和查询能力。其中,Where() 是 Linq 中最常用的操作符之一,主要用于根据指定的条件筛选出序列中满足条件的元素,并返回这个元素组成的新序列。 该操作符的基本语法如下: public static IEnumerable<T…

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