个性化阅读
专注于IT技术分析

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

本文概述

对于许多音频创作者而言, 生成表示某些音频的视觉方式可能是一种在线推广内容的好方法。如果你正在从事某种产品的音乐家或相关工作, 则你的应用程序应该能够轻松生成此类资产。 NAudio是一种很好的启动方法, 因为你需要从要获取音频波的音频中获取峰值。

在本文中, 我们将与你分享一种非常简单的方法, 借助NAudio库和系统绘图类来创建此类波形音频图像。

要求

你将需要使用NuGet程序包管理器在项目中安装NAudio库。打开你的Winforms C#项目, 然后在解决方案资源管理器中打开NuGet程序包管理器:

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

转到浏览选项卡并搜索NAudio:

NAudio安装NuGet软件包

从列表中, 选择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的解决方案资源管理器添加现有类。只需右键单击你的项目, 选择”添加”选项, 然后从下拉列表中选择”现有项”选项:

WaveFormRenderLib包括NAudio类

这将打开一个新的文件浏览器, 现在导航到克隆的WaveFormRenderer项目的文件夹, 并包括克隆项目的WaveFormRendererLib目录中的类:

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);

这将绘制如下图:

NAudio绘图音频波形图

完整的例子

在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);
        }
    }
}

执行之前的代码, 并单击按钮时, 将生成以下图像:

NAudio波形示例

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在C#WinForms中使用NAudio从MP3音频文件渲染音频波形图像

评论 抢沙发

评论前必须登录!