Как сделать изображение Audio Wave из аудиофайла MP3 с помощью NAudio в C # WinForms

Для многих создателей аудио создание визуального способа представления аудио может быть отличным способом продвижения контента в Интернете. Если вы работаете над каким-либо продуктом для музыканта или для работы, связанной с этим, ваше приложение должно легко генерировать такой актив. NAudio — отличный способ начать, так как вам нужно будет получить пики из аудио, которые вы хотите получить аудио волны.

В этой статье мы поделимся с вами очень простым способом создания таких звуковых образов с помощью библиотеки NAudio и классов системного рисования.

Требования

Вам нужно будет установить библиотеку NAudio в свой проект, используя менеджер пакетов NuGet. Откройте проект Winforms C # и откройте менеджер пакетов NuGet в обозревателе решений:

Перейдите на вкладку Обзор и найдите NAudio:

NAudio Установить пакет NuGet

Из списка выберите пакет NAudio от Mark Heath и установите его, просто нажав кнопку Install. После завершения установки вы сможете импортировать пространство имен Wave NAudio в класс, где вы хотите использовать его следующим образом:

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. Просто щелкните правой кнопкой мыши по вашему проекту, выберите опцию Add и из выпадающего меню выберите опцию Existing Item:

WaveFormRenderLib включает классы NAudio

Это откроет новый файловый браузер, теперь перейдите в папку клонированного проекта WaveFormRenderer и включите классы из WaveFormRendererLib каталог клонированного проекта:

WaveFormRendererLib файлы

Это добавит копию классов в ваш проект и выставит их в WaveFormRenderer Пространство имен автоматически.

2. Генерация изображения представления звуковой волны

Логика создания изображения звуковых волн довольно проста с помощью предыдущих добавленных классов. Во-первых, включите все пространства имен, которые нам понадобятся, и это классы из WaveFormRendererLib и System Drawing Classes. Затем настройте RMS (Root-Mean-Square) и пиковые поставщики. В качестве следующего шага настройте изображение с цветами, фоновыми изображениями и размером, используя StandardWaveFormRendererSettings (вы можете использовать автозаполнение Visual Studio, чтобы узнать все настраиваемые параметры).

Наконец, используя экземпляр WaveFormRenderer класс, предоставьте предварительно настроенные параметры в качестве аргументов приведения Render метод. Этот метод возвращает экземпляр 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 Plot Аудио волновая диаграмма

Полный пример

В этом небольшом фрагменте формы 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 Wave Form Пример

Ссылка на основную публикацию
Adblock
detector