本文概述
对于许多音频创作者而言, 生成表示某些音频的视觉方式可能是一种在线推广内容的好方法。如果你正在从事某种产品的音乐家或相关工作, 则你的应用程序应该能够轻松生成此类资产。 NAudio是一种很好的启动方法, 因为你需要从要获取音频波的音频中获取峰值。
在本文中, 我们将与你分享一种非常简单的方法, 借助NAudio库和系统绘图类来创建此类波形音频图像。
要求
你将需要使用NuGet程序包管理器在项目中安装NAudio库。打开你的Winforms C#项目, 然后在解决方案资源管理器中打开NuGet程序包管理器:
转到浏览选项卡并搜索NAudio:
从列表中, 选择Mark Heath提供的NAudio软件包, 然后单击”安装”按钮即可进行安装。安装完成后, 你将可以在要使用它的类中导入NAudio的Wave命名空间, 如下所示:
using NAudio.Wave;
如果你已经安装了NAudio, 则继续执行代码。
1.在你的项目中注册NAudio.WaveFormRenderer类
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 images
git clone https://github.com/naudio/NAudio.WaveFormRenderer.git
在项目中包含WaveFormRendererLib目录的类的最简单方法是使用Visual Studio的解决方案资源管理器添加现有类。只需右键单击你的项目, 选择”添加”选项, 然后从下拉列表中选择”现有项”选项:
这将打开一个新的文件浏览器, 现在导航到克隆的WaveFormRenderer项目的文件夹, 并包括克隆项目的WaveFormRendererLib目录中的类:
这将在你的项目中添加类的副本, 并将它们自动在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 step
using WaveFormRendererLib;
// Include the System Drawing classes
using System.Drawing.Imaging;
using System.Drawing;
// 1. Configure Providers
MaxPeakProvider maxPeakProvider = new MaxPeakProvider();
RmsPeakProvider rmsPeakProvider = new RmsPeakProvider(200); // e.g. 200
SamplingPeakProvider samplingPeakProvider = new SamplingPeakProvider(200); // e.g. 200
AveragePeakProvider averagePeakProvider = new AveragePeakProvider(4); // e.g. 4
// 2. Configure the style of the audio wave image
StandardWaveFormRendererSettings 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 settings
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);
// 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 transparent
myRendererSettings.BackgroundColor = Color.Transparent;
// Change the color of the peaks
myRendererSettings.TopPeakPen = new Pen(Color.DarkGreen);
myRendererSettings.BottomPeakPen = new Pen(Color.Green);
这将绘制如下图:
完整的例子
在Windows窗体的这一小片段中, 你将有一个简单的按钮, 单击该按钮将触发逻辑来生成图像:
using System;
using System.Windows.Forms;
// Include WaveFormRendererLib
using 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. 200
SamplingPeakProvider samplingPeakProvider = new SamplingPeakProvider(200); // e.g. 200
AveragePeakProvider averagePeakProvider = new AveragePeakProvider(4); // e.g. 4
StandardWaveFormRendererSettings 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);
}
}
}
执行之前的代码, 并单击按钮时, 将生成以下图像:
编码愉快!
评论前必须登录!
注册