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

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

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

相关文章

卡券/直冲 在对接接口api如何选择?

一、选择卡券/直冲对接接口API的考虑因素 &#xff08;一&#xff09;功能需求方面 业务功能匹配首先要明确自身业务对于卡券或直冲功能的具体需求。例如&#xff0c;如果是电商业务&#xff0c;可能需要卡券API具备创建、发放、验证各种类型优惠券&#xff08;如满减券、折扣…

10个超好用的企业文档加密软件丨2024年加密软件大盘点

都2024年了&#xff01; 泄密事件依旧频发&#xff01; 到底该如何防止文档信息泄密&#xff1f; 别急&#xff0c;本文小编为你整理了10款超好用的企业文档加密软件&#xff0c;有力保护你的文档信息安全&#xff0c;快来看看吧&#xff0c;一定有你的菜&#xff01; 1. 安企…

海报制作哪个软件好?建议试试这5个

2024年过得飞快&#xff0c;转眼间国庆佳节即将到来。 在这个举国欢庆的时刻&#xff0c;无论是商家还是个人&#xff0c;都希望通过海报来传递节日的喜悦和祝福。制作一张吸引人的海报&#xff0c;不仅能提升品牌形象&#xff0c;还能增强节日氛围。 那么&#xff0c;如何快…

工程车辆目标检测、工程车检测算法、工程车辆类型检测算法

工程车检测算法主要用于智能交通系统、建筑工地管理、矿山开采、物流运输等领域&#xff0c;通过图像识别技术来检测和识别工程车&#xff0c;以提高安全管理、交通流量管理和资源调度的效率。以下是关于工程车检测算法的技术实现、应用场景及优势的详细介绍。 一、技术实现 工…

线性代数(持续更新)

一.矩阵及其计算 1.矩阵的概念 矩阵就是一个数表 元素全是0&#xff0c;是零矩阵&#xff0c;用0来表示 当mn时&#xff0c;称为n阶矩阵&#xff08;方阵&#xff09; 只有一行的叫行矩阵&#xff0c;只有一列的叫列矩阵 只有对角线有元素的叫做对角矩阵&#xff0c;用dia…

LiveNVR监控流媒体Onvif/RTSP功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大

LiveNVR监控流媒体Onvif/RTSP功能-支持电子放大拉框放大直播视频拉框放大录像视频流拉框放大电子放大 1、视频广场2、录像回看3、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、视频广场 视频广场 -》播放 &#xff0c;左键单击可以拉取矩形框&#xff0c;放大选中的范围&#xff…

POST请求的艺术:如何有效使用POST方法

在HTTP协议中&#xff0c;POST方法是一种用于向服务器提交数据的请求方式。与GET请求不同&#xff0c;POST请求将数据包含在请求体&#xff08;request body&#xff09;中&#xff0c;而不是URL中。这使得POST请求更适合传输大量数据和敏感信息。本文将探讨如何有效使用POST方…

【递归】4.二叉树的前序遍历

1 题目解析 题目链接&#xff1a;二叉树的前序遍历 题目描述如下&#xff1a; 先回顾一下&#xff0c;二叉树的前序遍历的过程是&#xff1a;先遍历根&#xff0c;再遍历左子树&#xff0c;最后遍历右子树。 所以顺序就是&#xff1a;根&#xff0c;左子树&#xff0c;右子树…

Supabase 入门指南

Supabase 是一个开源替代品&#xff0c;用于 Firebase 提供的后端服务。它基于 PostgreSQL&#xff0c;提供实时数据库、身份验证、存储等功能。本文将深入探讨 Supabase 的主要功能&#xff0c;并结合不同场景给出代码实例。 1. 创建 Supabase 项目 首先&#xff0c;访问 S…

vulnhub靶场Matrix-win全流程

Matrix-Breakout 2 Morpheus&#xff08;win操作&#xff09; 如果靶场出现发送数据包无响应的情况&#xff0c;请重启服务器 靶机下载地址&#xff1a; https://download.vulnhub.com/matrix-breakout/c-2-morpheus.ova攻击机&#xff1a;win11(192.168.5.1) 信息收集 本…

React学习笔记(四)——React 组件生命周期

目录 1. 生命周期-概览 2. 生命周期-挂载阶段 3. 生命周期-更新阶段 4. 生命周期-卸载阶段 5. setState扩展-发现问题 6. setState扩展-更多用法 7. setState扩展-异步 1. 生命周期-概览 了解react类组件生命周期整体情况 大致步骤&#xff1a; 什么是生命周期React类组…

C盘空间不足--WizTree(管理空间)

WizTree&#xff1a;高效的磁盘空间分析工具 在日常使用电脑的过程中&#xff0c;磁盘空间的管理常常成为一个棘手的问题。随着文件的不断增加&#xff0c;我们的硬盘空间逐渐被占满&#xff0c;而这些文件中有很多其实并不重要。为了帮助用户更好地管理磁盘空间&#xff0c;Wi…

已存在的Python项目使用依赖管理工具UV

1. 文档 uv文档 2. 如何转换 初始化 uv initrequirements.txt转换成pyproject.toml uv add $(cat requirements.txt)删除requirements.txt 如果更新pyproject.toml之后&#xff0c;使用命令 uv sync替换项目环境 如果有库没有加入依赖&#xff0c;自己手动加一下&am…

美化网页,特效

当阅读博客园的文章时&#xff0c;经常看到精美的特效 博客园美化 - 凌云 - 博客园 (cnblogs.com) 简直不要太好看 自己写了一个前后端分离的网站后&#xff0c;想着应用这些特效&#xff0c;毕竟别人看到特效后逼格还是挺高的 于是&#xff0c;我F12把代码拿了下来 【手动狗…

普通人想自学AI产品经理,我劝你谨慎!

随着大模型技术的快速发展&#xff0c;市面上涌现出了大量的大模型产品岗位&#xff0c;那么想要进入AI行业的产品经理同学&#xff0c;需要提前做好哪些准备工作呢&#xff1f;这篇文章里&#xff0c;作者总结了入行AI的必备知识&#xff0c;包括市场调研、产品底层逻辑等内容…

逆概率加权(R和Python案例)

逆概率加权&#xff08;Inverse Probability Weighting, IPW&#xff09;是一种统计技术&#xff0c;用于观察性研究中调整混杂变量的影响&#xff0c;以便更准确地估计因果关系。这种方法特别有用于在无法进行随机化实验的情况下&#xff0c;通过给予不同个体不同的权重&#…

2024年9月最新web3开发人员薪资情况(包括不同语言、各个国家)

2024年9月最新web3非开发人员薪资情况&#xff08;包括不同语言、各个国家&#xff09; 开发人员的薪水是多少&#xff1f; Web3 开发人员的平均年薪为 14 万至 20 万美元。 量化开发人员每年可赚 20 万至 30 万美元 高级开发人员年薪 16 万至 25.7 万美元 北美开发商年薪 …

了解云计算工作负载保护的重要性,确保数据和应用程序安全

云计算de小白 云计算技术的快速发展使数据和应用程序安全成为一种关键需求&#xff0c;而不仅仅是一种偏好。随着越来越多的客户公司将业务迁移到云端&#xff0c;保护他们的云工作负载&#xff08;指所有部署的应用程序和服务&#xff09;变得越来越重要。云工作负载保护&…

可视掏耳勺鸡肋吗?高清可视掏耳勺牌子推荐!

很多人习惯在洗漱完顺手拿一根棉签掏耳朵&#xff0c;但是棉签的表面直径大且粗糙&#xff0c;不易将耳朵深处的耳垢挖出&#xff0c;耳垢堆积在耳道深处长时间不清理会导致堵塞耳道&#xff0c;引起耳鸣甚至感染。而可视掏耳勺作为一种新型的挖耳工具&#xff0c;它的安全性也…

【java常见面试题】

IO 按照流的流向分类&#xff1a;输入流和输出流 按照操作单元分类&#xff1a;可以分为字节流和字符流 按照流的角色划分&#xff1a;节点流和处理流 所有输入流的基类&#xff1a;InputStream/Reader 字节流/字符流 所有输出流的基类&#xff1a;OutputStream/Reader 字…