.NET 高级音频处理利器 NAudio 库

目录

前言

项目介绍

项目说明

常用类

常用接口

项目示例

1、创建项目

2、NuGet安装 NAudio 与 NAduio.Core包

3、使用说明

4、录制文件代码

5、播放文件代码

6、注意

项目总结

最后

前言

NAudio 是一个开源音频库,用于在 C# 应用程序中处理音频。

它提供了丰富的属性和方法,使我们能够轻松地读取、写入、转换及处理音频数据。

感兴趣的朋友们,可以一起来学习探索它的强大功能。

项目介绍

在.NET 平台上,NAudio 提供了丰富的音频操作功能。

它支持多种 API 进行音频播放与录制,兼容不同的音频格式,并能够进行音频格式转换(包括重采样、位深度调整、声道变换等)。另外,NAudio 还具备音频编码、多通道播放以及音频效果处理等多种功能。

项目说明

播放音频,我们可以使用 NAudio 库中的 WaveOutEvent 类。

以下是与音频播放相关的常用类和接口概述:

常用类
  • WaveOut:表示波形输出,继承自 IWavePlayer,用于播放音频。它接受 IWaveProvider 作为播放源,并通过扩展方法支持 ISampleProvider 作为播放源。
  • WaveIn:表示波形输入,继承自 IWaveIn,例如来自麦克风的输入或计算机正在播放的音频流。
  • WaveStream:表示波形流,继承自 IWaveProvider,可以用作播放源。
  • WaveFileReader:继承自 WaveStream,用于读取 .wav 文件。
  • WaveFileWriter:继承自 Stream,用于写入文件,常用于保存音频录制的数据。
  • AudioFileReader:通用音频文件读取器,除了 .wav 文件外,还可以读取其他类型的音频文件,如 .aiff 和 .mp3。
常用接口
  • IWaveProvider:波形提供者,作为音频播放的提供者,可以通过扩展方法转换为 ISampleProvider。
  • ISampleProvider:采样提供者,通过扩展方法可以作为 WaveOut 的播放源。

通过这些类和接口,NAudio 提供了灵活的方式来处理音频播放和录制。

项目示例

1、创建项目
dotnet new console -n DotNetCore.AudioExample
cd DotNetCore.AudioExample
2、NuGet安装 NAudio 与 NAduio.Core包

使用以下命令添加NAudio包到项目中,具体如下所示:

dotnet add package NAudio

或者在NuGet包管理器中,搜索NAudio或NAduio.Core(根据需求选择),然后点击安装。

3、使用说明

示例在.NET 6下,我们需要引用core版本。

4、录制文件代码

代码说明

1、WaveInEvent:用于从音频输入设备(如麦克风)捕获音频。

2、WaveFileWriter:用于将音频数据写入WAV文件。

3、waveIn.DataAvailable += (sender, e) =>:这是一个事件处理器的添加。当 waveIn 对象有可用的音频数据时,它会触发 DataAvailable 事件。

4、writer.Write(e.Buffer, 0, e.BytesRecorded):当有音频数据可用时,这段代码会被执行。它将音频数据从 e.Buffer 写入到WAV文件中。

5、waveIn.StartRecording() 和 waveIn.StopRecording():这两个方法分别用于开始和停止录音。

#region 1、录音示例  
var isRecording = false;
var isPaused = false;
var fileName = $"{DateTime.Now:yyyy-MM-dd-HH-mm-ss}.wav";
try
{
    using var waveIn = new WaveInEvent();
    using var writer = new WaveFileWriter(fileName, waveIn.WaveFormat);

    waveIn.DataAvailable += (sender, e) =>
    {
        if (isRecording && !isPaused)
        {
            writer.Write(e.Buffer, 0, e.BytesRecorded);
        }
    };

    Console.WriteLine("您好,欢迎使用录音软件,请按“R”键开始录制,按“P”键暂停/恢复,按“S”键停止。");

    while (true)
    {
        var pressKey = Console.ReadKey(true).Key;
        switch (pressKey)
        {
            case ConsoleKey.R:
                if (!isRecording)
                {
                    waveIn.StartRecording();
                    isRecording = true;
                    Console.WriteLine("录制已开始...");
                }
                break;
            case ConsoleKey.P:
                if (isRecording)
                {
                    if (isPaused)
                    {
                        waveIn.StartRecording();
                        isPaused = false;
                        Console.WriteLine("录制已恢复...");
                    }
                    else
                    {
                        waveIn.StopRecording();
                        isPaused = true;
                        Console.WriteLine("录制已暂停...");
                    }
                }
                break;
            case ConsoleKey.S:
                if (isRecording)
                {
                    waveIn.StopRecording();
                    isRecording = false;
                    isPaused = false;
                    Console.WriteLine("录制已停止...");
                }
                return; // 退出循环和程序
            default:
                Console.WriteLine("无效的按键。请按“R”开始录制,按“P”暂停/恢复,按“S”停止。");
                break;
        }
    }
}
catch (Exception ex)
{
    Console.WriteLine($"发生错误:{ex.Message}");
}
#endregion

运行效果

启动按R开始录音,按P暂停和恢复,按S停止,具体如下图所示:

当前录音文件默认存储于 bin 目录下。可以查看生成的录音文件。

5、播放文件代码

定义变量

// 音频播放器实例
private static WaveOutEvent waveOut;
// 音频文件读取实例
private static WaveFileReader reader;
// 默认音频文件路径
private const string DefaultFilePath = @"D:\demo.wav";

定义播放方法

/// <summary>
/// 初始化音频播放器
/// </summary>
static void InitializeAudioPlayer()
{
    waveOut = new WaveOutEvent();
}

/// <summary>
/// 播放音频文件
/// </summary>
/// <param name="filePath"></param>
static void PlayAudio(string filePath)
{
    try
    {
        reader?.Dispose();
        reader = new WaveFileReader(filePath);
        waveOut.Init(reader);
        waveOut.Volume = 1.0f;
        waveOut.Play();
        Console.WriteLine("正在播放音频文件... ");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"播放音频时出错: {ex.Message}");
    }
}

/// <summary>
/// 暂停播放
/// </summary>
static void PausePlayback()
{
    if (waveOut != null && waveOut.PlaybackState == PlaybackState.Playing)
    {
        waveOut.Pause();
        Console.WriteLine("暂停播放...");
    }
}

/// <summary>
/// 恢复播放
/// </summary>
static void ResumePlayback()
{
    if (waveOut != null && waveOut.PlaybackState == PlaybackState.Paused)
    {
        waveOut.Play();
        Console.WriteLine("恢复播放...");
    }
}

/// <summary>
/// 停止播放
/// </summary>
static void StopPlayback()
{
    if (waveOut != null && (waveOut.PlaybackState == PlaybackState.Playing || waveOut.PlaybackState == PlaybackState.Paused))
    {
        waveOut.Stop();
        reader?.Close();
        Console.WriteLine("已停止播放...");
    }
}

调用播放

//初始化音频播放器
InitializeAudioPlayer();

//播放默认音频文件
PlayAudio(DefaultFilePath);

Console.WriteLine("您好,请按“P”键暂停,按“R”键恢复,按“S”键停止,或按任何其他键退出。");

while (true)
{
    var key = Console.ReadKey(true).Key;
    switch (key)
    {
        case ConsoleKey.P:
            PausePlayback();
            break;
        case ConsoleKey.R:
            ResumePlayback();
            break;
        case ConsoleKey.S:
            StopPlayback();
            return;
        default:
            return;
    }
}

运行效果

程序启动自动播放文件,按P键暂停播放,按R键恢复播放,按S键停止播放并退出,具体如下图所示:

6、注意

以上内容仅为简单示例。如需实现更多功能,可以根据具体需求进行定制开发。

以下是一些可能的扩展方向:

  • 多格式支持:除了 WAV 格式,可以支持 MP3、FLAC、AAC 等其他音频格式,以适应不同的应用场景。
  • 实时预览:在录音过程中提供实时音频预览功能,以便实时监控录音质量和调整录音设置。
  • 语音识别:集成语音识别功能,将录音转换为文本,适用于会议记录、采访整理等场合。
  • 网络传输:将录音文件上传至云端服务器或其他设备,便于远程访问和备份。
  • 定时录音:设置定时录音功能,自动在指定时间开始录音,适合无人值守的应用场景。
  • 界面优化:增加图形用户界面(GUI),使操作更加直观便捷,提升用户体验。
  • 多通道录音:支持多通道录音,适用于专业音频制作场景,如音乐会录制、电影配乐等。
  • 高级设置:提供高级录音设置选项,如采样率、比特率、编码格式等参数调整,以满足专业用户的特定需求。

根据具体应用场景,可以选择上述功能中的部分或全部进行扩展,以满足更复杂的需求。

同时,也可以结合其他技术,如人工智能、云计算等,进一步增强应用的功能和性能。

项目总结

NAudio 是一款功能强大的 .NET 音频处理库,提供了丰富的工具和类,用于音频播放、录音、编辑和处理等多种应用场景。

希望本文能为朋友们在音频处理方面的开发带来帮助。欢迎大家在评论区留言讨论,分享您的经验和建议。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!优秀是一种习惯,欢迎大家留言学习!

猜你喜欢

转载自blog.csdn.net/u012573563/article/details/142361884