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

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

本文概述

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文件转换为WAV1

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

NAudio安装NuGet软件包

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

using NAudio.Wave;

如果你已经安装了NAudio, 则可以使用以下任一选项继续转换MP3文件:

注意

你需要使用的选项完全取决于运行代码的主机。例如, Mp3FileReader类使用Windows的几乎所有消费者版本上都存在的ACM MP3编解码器。但是, 请务必注意, 某些Windows Server版本在未安装”桌面体验”组件的情况下未安装此编解码器。

A.使用Mp3FileReader类

将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 Mp3FileReader
using 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 extension
            string 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 file
            using (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 MediaFoundationReader
using 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 extension
            string 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 file
            using (MediaFoundationReader reader = new MediaFoundationReader(InputAudioFilePath))
            {
                WaveFileWriter.CreateWaveFile(OutputAudioFilePath, reader);
            }
        }
    }
}

C.在NLayer中使用Mp3FileReader类

如果要使用NLayer(完全托管的MP3到WAV解码器), 则还需要使用NuGet软件包管理器进行安装:

NLayer Mp3FileReader与NuGet软件包一起安装

安装后, 你将能够导入我们将在转换过程中使用的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 MediaFoundationReader
using 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 extension
            string 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 file
            using (Mp3FileReader reader = new Mp3FileReader(InputAudioFilePath, wf => new Mp3FrameDecompressor(wf)))
            {
                WaveFileWriter.CreateWaveFile(OutputAudioFilePath, reader);
            }
        }
    }
}

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在WinForms C#中使用NAudio将MP3文件转换为WAV

评论 抢沙发

评论前必须登录!