本文概述
- 要求
- 1.在你的项目中注册NAudio.WaveFormRenderer类
- 2.生成音频波表示图像
- 定制图表
- 完整的例子
在本文中, 我们将与你分享一种非常简单的方法, 借助NAudio库和系统绘图类来创建此类波形音频图像。
要求 你将需要使用NuGet程序包管理器在项目中安装NAudio库。打开你的Winforms C#项目, 然后在解决方案资源管理器中打开NuGet程序包管理器:
文章图片
转到浏览选项卡并搜索NAudio:
文章图片
从列表中, 选择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的解决方案资源管理器添加现有类。只需右键单击你的项目, 选择” 添加” 选项, 然后从下拉列表中选择” 现有项” 选项:
文章图片
这将打开一个新的文件浏览器, 现在导航到克隆的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 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);
这将绘制如下图:
文章图片
完整的例子 在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);
}}}
执行之前的代码, 并单击按钮时, 将生成以下图像:
文章图片
编码愉快!
推荐阅读
- Symfony服务”uri_signer”依赖于不存在的参数”kernel.secret”
- 如何在Winforms C#中使用DarkUI(黑暗用户界面)
- 如何在Symfony 3中使用PHP将PDF转换为文本(从PDF提取文本)
- 你需要了解的有关SQLite Mobile数据库的所有信息
- 如何在Windows中删除名称以点结尾的文件夹或文件
- 如何在Symfony 3中使用Flash消息(在控制器和Twig视图内)
- Spring boot应用失败,Jackson2ObjectMapperBuilder。可见性不存在
- 带有标签的Flutter SliverAppBar覆盖内容
- Android 4.3上的javax.net.ssl.SSLHandshakeException