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

news2024/9/25 15:22:33

目录

前言

项目介绍

项目说明

常用类

常用接口

项目示例

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2163936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IoTDB 论文入选三大数据库顶会:ICDE、SIGMOD、VLDB 收录自研成果!

2024 三大顶会收录“成就” 随着数据库领域三大国际顶级会议 ICDE、SIGMOD、VLDB 2024 会议落幕&#xff0c;我们骄傲的宣布 Apache IoTDB 团队成员的多篇论文均被收录&#xff01;其研究成果均已在 IoTDB 实现&#xff0c;或基于 IoTDB 进行了性能评估。 以下整理收录论文名称…

过来人谈谈:我是如何师通过软考高级系统架构设计师的?

一丶关于教材内容 虽然系统架构设计师要考的内容远远不止于考试教材&#xff0c;但是熟读教材内容依然有必要的。 2022年&#xff0c;我利用一些碎片时间走马观花式地翻了一遍教材内容&#xff08;《系统架构设计师教程》和《系统架构设计师考试全程指导》&#xff09;&#…

网络事件管理

网络事件管理是运行组织 IT 网络不可或缺的一部分&#xff0c;网络事件管理的最终目标很简单&#xff1a;在发生中断时尽快恢复服务或功能。但是为了高效和一致地进行&#xff0c;IT 运营团队需要时刻保持警惕&#xff0c;不断了解网络事件&#xff0c;并且必须系统地遵循一套程…

除氟剂在芯片行业的应用

除氟剂在芯片行业的应用主要体现在对含氟废水的处理上。芯片生产过程中&#xff0c;特别是在湿法工序中&#xff0c;常用氢氟酸或BOE&#xff08;Buffered Oxide Etch&#xff0c;缓冲氧化物刻蚀液&#xff09;等化学物质进行刻蚀和清洗&#xff0c;这些过程会产生含有氟离子的…

如何避免U盘重要数据泄露?U盘加密方法推荐

随着科技的不断发展&#xff0c;U盘已经成为我们日常生活中不可或缺的存储工具。然而&#xff0c;由于U盘体积小巧、携带方便&#xff0c;一旦丢失或被他人恶意使用&#xff0c;重要数据泄露的风险极大。为了避免这种情况发生&#xff0c;我们需要对U盘进行加密&#xff0c;确保…

什么是组态、组态的应用场景介绍

随着计算机技术和工业自动化水平迅速提高&#xff0c;而车间现场种类繁杂的控制设备和过程监控装置使得传统的工业控制软件无法满足用户的各种需求。在“组态”概念出现之前&#xff0c;工程技术人员需要通过编写程序来实现某一任务&#xff0c;不但工作量大、周期长&#xff0…

C++之 string(中)

C之 string string类对象的容量操作 resize 将有效字符的个数该成n个&#xff0c;多出的空间用字符c填充 虽然在string里用的不多&#xff0c;但是在vector里面常见 这里有三种情况&#xff1a; 1&#xff09;resize小于当前的size 2)resize大于当前的size,小于capacity …

自适应企业网站建站系统源码 带完整的安装代码包以及搭建部署教程

系统概述 传统的建站方式往往需要耗费大量的时间和资源&#xff0c;而且对于非专业人士来说&#xff0c;操作难度较大。为了满足企业快速建站的需求&#xff0c;自适应企业网站建站系统源码应运而生。该源码的开发团队致力于打造一款功能齐全、易于操作的建站系统&#xff0c;…

PingCastle:一款针对活动目录AD的安全强化工具

关于PingCastle PingCastle是一款针对活动目录AD的安全强化工具&#xff0c;可以帮助广大研究人员提升活动目录的安全性&#xff0c;该工具甚至可以做到在 20% 的时间内实现 80% 的AD安全性。 Ping Castle 是一种旨在使用基于风险评估和成熟度框架的方法快速评估活动目录AD 安…

power bi制作各季度收入累加柱状图——日期表、calculate、datesytd

一、数据介绍&#xff1a; 2017-2019年订单销售收入数据&#xff08;订单日期&#xff0c;销售收入&#xff09; 二、效果展示&#xff1a; 三、操作步骤&#xff1a; 1、建立日期表 &#xff08;1&#xff09;建立原因 本次度量值编写需要运用到datesytd这一时间智能函数…

2024 IDEA软件 部署tomcat 十二步 运行web页面(html类似的)(中英文对照版本)新手小白易上手

目录 一、准备工作&#xff08;三必备&#xff09;&#xff1a; 1、自己的web项目 2、idea软件&#xff08;我是2023.1.2版本&#xff09; 3、tomcat X.X版本 二 、正式开始步骤&#xff0c;不废话&#xff01;&#xff01; 1、 点击菜单栏中 “File”&#xff08;文件&…

2024年双十一值得入手的好物有哪些?五大性价比拉满闭眼入好物盘点

随着2024年双十一购物狂欢节的临近&#xff0c;消费者们纷纷开始关注各类好物&#xff0c;期待在这一天能够以最优惠的价格入手心仪的商品&#xff0c;在这个特殊的时刻&#xff0c;我们为大家盘点了五大性价比拉满的闭眼入好物&#xff0c;这些产品不仅品质卓越&#xff0c;而…

geoserver发布shp地图

创建新的 存储仓库 file:///var/lib/tomcat9/webapps/geoserver/shp/shengdao/省道.shp 发布图层后&#xff0c;可以看到这个图层的重要attribute 复制&#xff0c;或者 创建新的样式style 这个属性比较讨厌 是 中文的 省 <sld:TextSymbolizer><sld:Label><og…

尚品汇-H5移动端整合系统(五十五)

目录&#xff1a; &#xff08;1&#xff09;运行前端页面 &#xff08;2&#xff09;启动前端页面 &#xff08;3&#xff09;添加搜索分类接口 &#xff08;4&#xff09;购物车模块修改 &#xff08;5&#xff09;登录模块 &#xff08;6&#xff09;订单模块 &#…

ubuntu安装libtorch

Ubuntu20.04安装libtorch 〇、前期准备1、查看NVIDIA显卡算力和CUDA版本支持的算力2、查看CUDA与显卡驱动的版本对应 一、NVIDIA显卡驱动安装1、下载显卡驱动2、安装驱动A. 安装依赖B. 禁用nouveau驱动C. 显卡驱动安装 3、参考 二、CUDA安装1、下载安装CUDA2、测试CUDA是否安装…

今年双11哪些东西值得买?分享五款实用耐用的好物,不再乱花钱!

随着一年一度的1111购物节脚步渐近&#xff0c;是否还在为挑选商品而犹豫不决&#xff1f;别担心&#xff0c;我们贴心整理了一份双十一必买好物推荐&#xff0c;专为追求品质生活的您量身打造。跟随这份清单&#xff0c;让您的数字生活更加丰富多彩&#xff0c;无需多虑&#…

四川财谷通信息技术有限公司抖音小店领域的新势力

在当今这个数字化浪潮汹涌的时代&#xff0c;电子商务已成为推动经济发展的重要引擎&#xff0c;而短视频平台抖音的崛起&#xff0c;更是为电商行业注入了前所未有的活力与机遇。在这片充满无限可能的蓝海中&#xff0c;四川财谷通信息技术有限公司凭借其敏锐的市场洞察力和强…

zabbix监控某特定进程是否挂掉

我现在已经在被监控机器&#xff08;A&#xff09;上装好了zabbix-agent&#xff0c;同时也在zabbix-server网页端添加了机器A 1&#xff0c;确定好要监控的进程 假如我想监控机器A上面的salt-minion这个进程&#xff0c;首先通过ps -ef 找到这个进程的命令启动行。 2&#x…

828华为云征文 | 云服务器Flexus X实例,Docker集成搭建FC-web模拟器

828华为云征文 | 云服务器Flexus X实例&#xff0c;Docker集成搭建FC-web模拟器 华为云端口放行 服务器放行对应端口9995 Docker安装并配置镜像加速 1、购买华为云 Flexus X 实例 Flexus云服务器X实例-华为云 (huaweicloud.com) 2、docker安装 yum install -y docker-ce3、验证…

vue2+elementUI实现handleSelectionChange批量删除-前后端

功能需求&#xff1a;实现选中一个或多个执行批量删除操作 在elementUI官网选择一个表格样式模板&#xff0c;Element - The worlds most popular Vue UI framework 这里采用的是 将代码复制到前端&#xff0c;这里是index.vue <template><el-button type"dang…