如何在WinForms C#中使用NAudio将MP3文件转换为WAV

本文概述

  • 要求
  • A.使用Mp3FileReader类
  • B.使用MediaFoundationReader类
  • C.在NLayer中使用Mp3FileReader类
MP3文件的最大缺点之一是它们不适合循环播放, 因为在文件的开头和结尾始终会有一个很小的无声间隙。这是因为MP3压缩算法在文件的开头和结尾处留出了10ms到50ms的静默空间。因此, 如果你尝试循环播放音频, 则可以在循环播放点听到短暂的停顿。简而言之, 你不会得到无缝循环。发生所谓的编码器延迟, 即静音间隔, 是因为MP3标准未定义记录延迟或填充量以供以后删除的方法。每个编码器的延迟也可能不同。这使得自动移除变得困难。更糟糕的是, 即使将两个轨道解压缩并合并为一个轨道, 通常在它们之间也将留有间隙。这是为什么有人总是要以WAV格式生成文件的技术原因之一, 但是还有其他一些简单的原因, 因为程序只需要WAV格式而不是MP3格式。
你可以使用广为人知的NAudio库轻松地将MP3文件转换为WAV, 这是本文提供的任何选项之后的.NET的音频和MIDI库。它们非常简单, 我们在具有单个按钮的简单表单的WinForms应用程序上下文中使用它们。当用户单击附加在button1_Click事件上的按钮时, 将执行将MP3文件转换为WAV的代码。它们全部遵循以下逻辑:使用Mp3FileReader打开MP3文件, 然后将其传递给WaveFileWriter.CreateWaveFile, 以将转换后的PCM音频写入WAV文件。这通常是44.1kHz 16位立体声, 但是使用MP3解码器发出的任何格式。
要求 你将需要使用NuGet程序包管理器在项目中安装NAudio库。打开你的Winforms C#项目, 然后在解决方案资源管理器中打开NuGet程序包管理器:
如何在WinForms C#中使用NAudio将MP3文件转换为WAV

文章图片
转到浏览选项卡并搜索NAudio:
如何在WinForms C#中使用NAudio将MP3文件转换为WAV

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

如果你已经安装了NAudio, 则可以使用以下任一选项继续转换MP3文件:
注意 你需要使用的选项完全取决于运行代码的主机。例如, Mp3FileReader类使用Windows的几乎所有消费者版本上都存在的ACM MP3编解码器。但是, 请务必注意, 某些Windows Server版本在未安装” 桌面体验” 组件的情况下未安装此编解码器。
A.使用Mp3FileReader类 【如何在WinForms C#中使用NAudio将MP3文件转换为WAV】将MP3文件转换为WAV的最简单方法是使用Mp3FileReader类, 该类期望将要转换的文件的路径作为第一个参数。这将返回该类的读取器实例, 这是转换文件的重要部分所需的WaveFileWrite类, 该类提供了一个静态方法, 即发生转换魔术的CreateWaveFile。此方法将目标文件路径和WAV文件的名称作为第一个参数, 将MP3文件的读取器作为第二个参数(提供应在新文件中存储哪些内容):
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; // Import Wave of NAudio to use the Mp3FileReaderusing NAudio.Wave; namespace Sandbox{public partial class Form1 : Form{public Form1(){InitializeComponent(); }private void Form1_Load(object sender, EventArgs e){}private void button1_Click(object sender, EventArgs e){// Store the path of the file that you want to convert into a wav// as well its new path and name with extensionstring InputAudioFilePath = @"C:\Users\sdkca\Desktop\song.mp3"; string OutputAudioFilePath = @"C:\Users\sdkca\Desktop\song_converted.wav"; // Use the Mp3FileReader to obtain the content of the audio and use the wavfilewriter// to create the new file in wav format in the providen path with the content of the fileusing (Mp3FileReader reader = new Mp3FileReader(InputAudioFilePath)){WaveFileWriter.CreateWaveFile(OutputAudioFilePath, reader); }}}}

B.使用MediaFoundationReader类 MediaFoundationReader是一个灵活的类, 它使你可以读取Media Foundation支持的任何音频文件格式。它通常在大多数Windows消费者版本上都包含MP3, 但通常还支持WMA, AAC, MP4等。因此, 除非你需要支持Windows XP或未安装任何Media Foundation的Windows版本, 否则这是一个不错的选择。逻辑与Mp3Reader类几乎相同, 创建一个读取器并将其提供为WaveFileWriter类的CreateWaveFile方法的第二个参数:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; // Import Wave of NAudio to use the MediaFoundationReaderusing NAudio.Wave; namespace Sandbox{public partial class Form1 : Form{public Form1(){InitializeComponent(); }private void Form1_Load(object sender, EventArgs e){}private void button1_Click(object sender, EventArgs e){// Store the path of the file that you want to convert into a wav// as well its new path and name with extensionstring InputAudioFilePath = @"C:\Users\sdkca\Desktop\song.mp3"; string OutputAudioFilePath = @"C:\Users\sdkca\Desktop\song_converted.wav"; // Use the MediaFoundationReader class to obtain the content of the audio and use the wavfilewriter// to create the new file in wav format in the providen path with the content of the fileusing (MediaFoundationReader reader = new MediaFoundationReader(InputAudioFilePath)){WaveFileWriter.CreateWaveFile(OutputAudioFilePath, reader); }}}}

C.在NLayer中使用Mp3FileReader类 如果要使用NLayer(完全托管的MP3到WAV解码器), 则还需要使用NuGet软件包管理器进行安装:
如何在WinForms C#中使用NAudio将MP3文件转换为WAV

文章图片
安装后, 你将能够导入我们将在转换过程中使用的NLayer的NAudioSupport类。该逻辑遵循前面示例的逻辑, 但是Mp3FileReader类实例将在构造函数中接收带有新的Mp3FrameDecompressor类实例的lambda表达式作为第二个参数:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; // Import Wave of NAudio to use the MediaFoundationReaderusing NAudio.Wave; using NLayer.NAudioSupport; namespace Sandbox{public partial class Form1 : Form{public Form1(){InitializeComponent(); }private void Form1_Load(object sender, EventArgs e){}private void button1_Click(object sender, EventArgs e){// Store the path of the file that you want to convert into a wav// as well its new path and name with extensionstring InputAudioFilePath = @"C:\Users\sdkca\Desktop\song.mp3"; string OutputAudioFilePath = @"C:\Users\sdkca\Desktop\song_converted.wav"; // Use the MediaFoundationReader class to obtain the content of the audio and use the wavfilewriter// to create the new file in wav format in the providen path with the content of the fileusing (Mp3FileReader reader = new Mp3FileReader(InputAudioFilePath, wf => new Mp3FrameDecompressor(wf))){WaveFileWriter.CreateWaveFile(OutputAudioFilePath, reader); }}}}

编码愉快!

    推荐阅读