如何在C#WinForms中使用NAudio从MP3音频文件渲染音频波形图像

本文概述

  • 要求
  • 1.在你的项目中注册NAudio.WaveFormRenderer类
  • 2.生成音频波表示图像
  • 定制图表
  • 完整的例子
对于许多音频创作者而言, 生成表示某些音频的视觉方式可能是一种在线推广内容的好方法。如果你正在从事某种产品的音乐家或相关工作, 则你的应用程序应该能够轻松生成此类资产。 NAudio是一种很好的启动方法, 因为你需要从要获取音频波的音频中获取峰值。
在本文中, 我们将与你分享一种非常简单的方法, 借助NAudio库和系统绘图类来创建此类波形音频图像。
要求 你将需要使用NuGet程序包管理器在项目中安装NAudio库。打开你的Winforms C#项目, 然后在解决方案资源管理器中打开NuGet程序包管理器:
如何在C#WinForms中使用NAudio从MP3音频文件渲染音频波形图像

文章图片
转到浏览选项卡并搜索NAudio:
如何在C#WinForms中使用NAudio从MP3音频文件渲染音频波形图像

文章图片
从列表中, 选择Mark Heath提供的NAudio软件包, 然后单击” 安装” 按钮即可进行安装。安装完成后, 你将可以在要使用它的类中导入NAudio的Wave命名空间, 如下所示:
using NAudio.Wave;

如果你已经安装了NAudio, 则继续执行代码。
1.在你的项目中注册NAudio.WaveFormRenderer类 【如何在C#WinForms中使用NAudio从MP3音频文件渲染音频波形图像】NAudio库本身不提供任何类型的渲染API, 而是需要在项目中依赖一些自定义类(但由NAudio团队发布)。这些类虽然未在NuGet上注册, 所以你需要在项目中手动添加它们。
你可以从NAudio.WaveFormRenderer的官方存储库中检索提到的文件, 特别是在WaveFormRendererLib目录中。你可以使用Git克隆整个项目, 例如:
# Clone the WaveFormRenderer project in some directory of your system to obtain the# classes that you need from this project to create the audio wave imagesgit clone https://github.com/naudio/NAudio.WaveFormRenderer.git

在项目中包含WaveFormRendererLib目录的类的最简单方法是使用Visual Studio的解决方案资源管理器添加现有类。只需右键单击你的项目, 选择” 添加” 选项, 然后从下拉列表中选择” 现有项” 选项:
如何在C#WinForms中使用NAudio从MP3音频文件渲染音频波形图像

文章图片
这将打开一个新的文件浏览器, 现在导航到克隆的WaveFormRenderer项目的文件夹, 并包括克隆项目的WaveFormRendererLib目录中的类:
如何在C#WinForms中使用NAudio从MP3音频文件渲染音频波形图像

文章图片
这将在你的项目中添加类的副本, 并将它们自动在WaveFormRenderer命名空间中公开。
2.生成音频波表示图像 借助之前添加的类, 创建音频波形图像的逻辑非常简单。首先, 包括我们需要的所有命名空间, 这些是WaveFormRendererLib和系统绘图类中的类。然后, 配置RMS(均方根)和Peak提供程序。下一步, 使用StandardWaveFormRendererSettings使用颜色, 背景图像和大小自定义图像(你可以使用Visual Studio的自动完成功能来了解所有可自定义的参数)。
最后, 使用WaveFormRenderer类的实例, 提供先前配置的参数作为强制转换Render方法的参数。此方法将返回System Drawing的Image实例, 因此你现在可以使用Save方法将其轻松存储在系统上, 这种方法的优点是可以将其保存为任何格式, 但是建议你使用PNG格式在图表样式的配置中具有透明度:
// Include WaveFormRendererLib, the namespace will be available// once you include the files of the project from the first stepusing WaveFormRendererLib; // Include the System Drawing classesusing System.Drawing.Imaging; using System.Drawing; // 1. Configure ProvidersMaxPeakProvider maxPeakProvider = new MaxPeakProvider(); RmsPeakProvider rmsPeakProvider = new RmsPeakProvider(200); // e.g. 200SamplingPeakProvider samplingPeakProvider = new SamplingPeakProvider(200); // e.g. 200AveragePeakProvider averagePeakProvider = new AveragePeakProvider(4); // e.g. 4// 2. Configure the style of the audio wave imageStandardWaveFormRendererSettings myRendererSettings = new StandardWaveFormRendererSettings(); myRendererSettings.Width = 1080; myRendererSettings.TopHeight = 64; myRendererSettings.BottomHeight = 64; // 3. Define the audio file from which the audio wave will be created and define the providers and settingsWaveFormRenderer renderer = new WaveFormRenderer(); String audioFilePath = @"C:\Users\sdkca\Desktop\when_the_sun_goes_down_arctic_monkeys.mp3"; Image image = renderer.Render(audioFilePath, averagePeakProvider, myRendererSettings); // 4. Store the image image.Save(@"C:\Users\sdkca\Desktop\myfile.png", ImageFormat.Png); // Or jpeg, however PNG is recommended if your audio wave needs transparency// image.Save(@"C:\Users\sdkca\Desktop\myfile.jpg", ImageFormat.Jpeg);

定制图表 如前所述, 你可以在StandardWaveFormRendererSettings中自定义峰, 例如自定义颜色:
StandardWaveFormRendererSettings myRendererSettings = new StandardWaveFormRendererSettings(); myRendererSettings.Width = 1080; myRendererSettings.TopHeight = 64; myRendererSettings.BottomHeight = 64; // Set background of the chart as transparentmyRendererSettings.BackgroundColor = Color.Transparent; // Change the color of the peaksmyRendererSettings.TopPeakPen = new Pen(Color.DarkGreen); myRendererSettings.BottomPeakPen = new Pen(Color.Green);

这将绘制如下图:
如何在C#WinForms中使用NAudio从MP3音频文件渲染音频波形图像

文章图片
完整的例子 在Windows窗体的这一小片段中, 你将有一个简单的按钮, 单击该按钮将触发逻辑来生成图像:
using System; using System.Windows.Forms; // Include WaveFormRendererLibusing WaveFormRendererLib; using System.Drawing.Imaging; using System.Drawing; namespace Sandbox{public partial class Form1 : Form{public Form1(){InitializeComponent(); }private void button1_Click(object sender, EventArgs e){MaxPeakProvider maxPeakProvider = new MaxPeakProvider(); RmsPeakProvider rmsPeakProvider = new RmsPeakProvider(200); // e.g. 200SamplingPeakProvider samplingPeakProvider = new SamplingPeakProvider(200); // e.g. 200AveragePeakProvider averagePeakProvider = new AveragePeakProvider(4); // e.g. 4StandardWaveFormRendererSettings myRendererSettings = new StandardWaveFormRendererSettings(); myRendererSettings.Width = 1080; myRendererSettings.TopHeight = 64; myRendererSettings.BottomHeight = 64; WaveFormRenderer renderer = new WaveFormRenderer(); String audioFilePath = @"C:\Users\sdkca\Desktop\when_the_sun_goes_down_arctic_monkeys.mp3"; Image image = renderer.Render(audioFilePath, averagePeakProvider, myRendererSettings); image.Save(@"C:\Users\sdkca\Desktop\mywave.png", ImageFormat.Png); }}}

执行之前的代码, 并单击按钮时, 将生成以下图像:
如何在C#WinForms中使用NAudio从MP3音频文件渲染音频波形图像

文章图片
编码愉快!

    推荐阅读