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日

相关文章

  • IE6下javasc#ipt:void(0) 无效的解决方法

    针对IE6下javasc#ipt:void(0)无效的解决方法,我们可以采取以下步骤: 1. 了解问题 在很多老版本的IE浏览器中,当我们使用 javascript:void(0) 作为超链接的href属性值时,某些情况下会出现链接无法点击的问题,比如在IE6下。因此需要寻找解决方法。 2. 解决方法 方法一:使用window.event.returnVal…

    C# 2023年6月7日
    00
  • 提高C# StringBuilder操作性能优化的方法

    提高C# StringBuilder操作性能优化的方法 前言 StringBuilder是C#语言中常用的字符串操作类之一,用于对字符串进行动态操作,比如追加、替换、插入等。在进行大量字符串操作时,使用StringBuilder可以提高性能,而不必像使用字符串拼接时那样频繁创建和销毁字符串对象。但是,如果使用不得当,StringBuilder也可能出现性能问…

    C# 2023年6月8日
    00
  • C#实现简易计算器功能(1)(窗体应用)

    下面是“C#实现简易计算器功能(1)(窗体应用)”的完整攻略,包含两个实例说明。 标题 C#实现简易计算器功能(1)(窗体应用) 简介 本文将介绍如何使用C#语言实现简易计算器功能。在这个教程中,我们将学习如何创建一个窗体应用程序,并使用C#语言来实现基本的计算器功能。 步骤 步骤1. 创建新项目 首先,打开Visual Studio,并点击“创建新项目”选…

    C# 2023年6月6日
    00
  • Docker结合.Net Core的初步使用教程

    Docker结合.Net Core的初步使用教程 Docker是一种容器化技术,可以将应用程序及其依赖项打包到一个容器中,以便在不同的环境中运行。在本文中,我们将介绍如何使用Docker结合.Net Core来构建和运行应用程序,并提供两个示例来说明如何使用它们。 安装Docker 在开始之前,我们需要安装Docker。可以在Docker官网下载适用于您的操…

    C# 2023年5月17日
    00
  • C#实现Windows Form调用R进行绘图与显示的方法

    下面我将为您详细讲解“C#实现WindowsForm调用R进行绘图与显示的方法”的完整攻略。本攻略将分为以下几个步骤: 安装R语言环境和R.Net库 在使用C#调用R前,需要先安装R语言环境和R.Net库。可以在R官网(https://www.r-project.org/)下载最新版本的R语言环境,并在控制台中安装R.Net库。R.Net库可以通过NuGet…

    C# 2023年5月15日
    00
  • C# Path.GetRandomFileName – 获取一个随机文件名

    Path.GetRandomFileName 方法是C#中的一个静态方法,其返回一个随机生成的文件名(不包含路径),该方法的作用是用于生成一个随机的文件名,以避免文件名的冲突问题。 使用该方法非常简单,只需要在代码中调用该静态方法即可,该方法的语法格式如下: public static string GetRandomFileName(); 该方法返回一个字…

    C# 2023年4月19日
    00
  • ASP.NET MVC实现登录后跳转到原界面

    ASP.NET MVC实现登录后跳转到原界面的完整攻略如下: 首先,在需要登录才能访问的控制器或方法上添加[Authorize]特性。例如: [Authorize] public class HomeController : Controller { public ActionResult Index() { return View(); } } 这样,当用…

    C# 2023年5月12日
    00
  • C#多线程学习(二) 如何操纵一个线程

    C#多线程学习(二) 如何操纵一个线程 下面我们就动手来创建一个线程,使用Thread类创建线程时,只需提供线程入口即可。(线程入口使程序知道该让这个线程干什么事) 在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,你可以把ThreadStart理解为一个函数指针,指向线程要执行的函数,当调用Thread.Start()方法后,…

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