首页 > 其他分享 >.NET 高级音频处理利器 NAudio 库

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

时间:2024-09-25 13:52:16浏览次数:9  
标签:Console NAudio waveOut 录音 WriteLine NET 播放 音频

目录

前言

项目介绍

项目说明

常用类

常用接口

项目示例

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技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!优秀是一种习惯,欢迎大家留言学习!

标签:Console,NAudio,waveOut,录音,WriteLine,NET,播放,音频
From: https://blog.csdn.net/u012573563/article/details/142361884

相关文章

  • 推荐7款.NET开源且功能强大图表库,效率提升利器!
    前言今天大姚给大家推荐7款.NET开源、免费、高效、功能强大图表库,这些库旨在助力你迅速实现图表开发需求,提升项目效率与质量。LiveCharts2LiveCharts2是一个.NET开源、简单、灵活、交互式且功能强大的.NET图表、地图和仪表库,现在几乎可以在任何地方运行如:Maui、UnoPlatform、Blazo......
  • C#|.net core 基础 - 扩展数组添加删除性能最好的方法
    C#|.netcore基础-扩展数组添加删除性能最好的方法 合集-C#|.netcore基础(6)  今天在编码的时候遇到了一个问题,需要对数组变量添加新元素和删除元素,因为数组是固定大小的,因此对新增和删除并不友好,但有时候又会用到,因此想针对数组封装两个扩展方法:新增元素与......
  • C# + WPF 音频播放器 界面优雅,体验良好
    C#+WPF音频播放器界面优雅,体验良好 合集-.NET开源工具(18)  阅读目录前言项目介绍项目页面项目源码项目地址最后前言本文介绍一款使用C#与WPF开发的音频播放器,其界面简洁大方,操作体验流畅。该播放器支持多种音频格式(如MP4、WMA、OGG、FLAC......
  • Netmiko
    在Netmiko的netmiko_send_config函数中,config_commands期望的是一个列表,即使你只想发送一个单独的命令,仍然需要将它放在一个列表里。这是因为netmiko_send_config的设计是为了处理多条命令的,因此它需要一个列表,即便这个列表只有一个元素。举个例子:错误用法(传递单个字符串......
  • 移动开发(一):使用.NET MAUI开发第一个安卓APP
     移动开发(一):使用.NETMAUI开发第一个安卓APP对于工作多年的C#程序员来说,近来想尝试开发一款安卓APP,考虑了很久最终选择使用.NETMAUI这个微软官方的框架来尝试体验开发安卓APP,毕竟是使用VisualStudio开发工具,使用起来也比较的顺手,结合微软官方的教程进行了安卓APP的开发,下......
  • 推荐3款卓越的 .NET 开源搜索组件库
    推荐3款卓越的.NET开源搜索组件库 思维导航前言Elasticsearch.NETLucene.NETSolrNet优秀项目和框架精选前言最近有不少同学提问;.NET有哪些开源的搜索组件库可以推荐的吗?,今天大姚给大家推荐3款卓越的.NET开源搜索组件库,希望可以帮助到有需要的同学。Elasti......
  • .net 到底行不行!2000 人在线的客服系统真实屏录演示(附技术详解)
    业余时间用.net写了一个免费的在线客服系统:升讯威在线客服与营销系统。时常有朋友问我性能方面的问题,正好有一个真实客户,在线的访客数量达到了2000人。在争得客户同意后,我录了一个视频。升讯威在线客服系统可以在极低配置的服务器环境下,轻松应对这种情况,依然可以做到:消息毫......
  • .NET 9 中 LINQ 新增的功能
    .NET9中LINQ新增的功能 思维导航LINQ介绍安装.NET9VSCode中编写ASP.NETCoreWeb应用VSCode中创建.NET9控制台应用CountBy方法AggregateBy方法Index(IEnumerable) 方法参考文章C#/.NET/.NETCore拾遗补漏LINQ介绍语言集成查询(LINQ)是一系列直接......
  • .NET 6.0 + WPF 使用 Prism 框架实现导航
    .NET6.0+WPF使用Prism框架实现导航 合集-.NET基础知识(4) 1..NET9优化,抢先体验C#13新特性08-202.《黑神话:悟空》神话再现,虚幻引擎与Unity/C#谁更强?08-213..NET6.0+WPF使用Prism框架实现导航09-114.2024年C#高效开发:精选实用类库09-23收起 ......
  • .NET 最好用的验证组件 FluentValidation
    .NET最好用的验证组件FluentValidation 合集-.NET开源工具(18)  阅读目录前言项目介绍项目使用高级用法项目地址总结最后前言一个.NET验证框架,支持链式操作,易于理解,功能完善,组件内提供十几种常用验证器,可扩展性好,支持自定义验证器,支持本地化多......