C# 如何使用NAudio将wma转换为mp3

C# 如何使用NAudio将wma转换为mp3,c#,mp3,naudio,wma,C#,Mp3,Naudio,Wma,请注意,这不是链接的其他问题的副本。这使用了我找不到的类,如下面的问题所述。 我正在尝试将wma文件转换为mp3。我需要一个可以集成到代码库中的解决方案,而不依赖于外部资源,因此使用ffmpeg不是一个选项。我一直在尝试NAudio,但没有成功 一个问题是NAudio似乎有两个版本,而且两个版本都不完整。从Nuget获得的文件不包括WMAFileReader类,因此无法(我可以看到)读取wma文件。包括WMAFileReader类,但似乎不包括Mp3Writer类,也不包括我在许多示例中看到的W

请注意,这不是链接的其他问题的副本。这使用了我找不到的类,如下面的问题所述。

我正在尝试将wma文件转换为mp3。我需要一个可以集成到代码库中的解决方案,而不依赖于外部资源,因此使用ffmpeg不是一个选项。我一直在尝试NAudio,但没有成功

一个问题是NAudio似乎有两个版本,而且两个版本都不完整。从Nuget获得的文件不包括WMAFileReader类,因此无法(我可以看到)读取wma文件。包括WMAFileReader类,但似乎不包括Mp3Writer类,也不包括我在许多示例中看到的WaveLib类

那么,有人知道我怎样才能得到能胜任这项工作的东西吗?我花了好几个小时尝试不同的代码示例,但它们似乎都不能与我能找到的NAudio的任何一个版本一起工作

理想情况下,我希望在内存中执行此操作,但如果我必须写入临时磁盘文件,这并不是世界末日

编辑我刚刚发现有更多NAudio nuget包扩展了基本包。有一个用于Lame,一个用于WMA,但即使安装了它们,我也无法让任何代码正常工作。

似乎很简单

创建一个新的控制台项目,使用
nuget
添加
NAudio.Lame
包(我创建该包是为了封装
Lame
MP3 DLL)。在本例中,我直接使用来自
nuget
本人的包

在某处添加以下方法:

static void ConvertToMP3(string sourceFilename, string targetFilename)
{
    using (var reader = new NAudio.Wave.AudioFileReader(sourceFilename))
    using (var writer = new NAudio.Lame.LameMP3FileWriter(targetFilename, reader.WaveFormat, NAudio.Lame.LAMEPreset.STANDARD))
    {
        reader.CopyTo(writer);
    }
}
使用WMA文件的文件名(或
AudioFileReader
类可读取的任何其他音频文件)和要保存并让其运行的文件名调用:

static void Main(string[] args)
{
    ConvertToMP3(@"C:\temp\test.wma", @"C:\temp\test_transcode.mp3");
}
当您的输入文件采用MP3编码器不支持的格式时,可能会出现问题。奇怪的频道计数、采样格式或采样率都可能导致MP3编写器失败。我的测试文件在解码时是44.1KHz单IEEE浮点格式,Lame编解码器非常乐意使用它。如果您发现其中一个不起作用,那么您必须进行一些示例转换,以将输入数据转换为兼容的格式

此外,您可能还想在
LameMP3FileWriter
构造函数中使用quality参数。有多种预设(如LAME编码器本身所定义的),或者如果愿意,可以尝试每秒千位的直接规格
NAudio.Lame.lameposet.STANDARD
生成一个128Kbps的文件。

似乎很简单

创建一个新的控制台项目,使用
nuget
添加
NAudio.Lame
包(我创建该包是为了封装
Lame
MP3 DLL)。在本例中,我直接使用来自
nuget
本人的包

在某处添加以下方法:

static void ConvertToMP3(string sourceFilename, string targetFilename)
{
    using (var reader = new NAudio.Wave.AudioFileReader(sourceFilename))
    using (var writer = new NAudio.Lame.LameMP3FileWriter(targetFilename, reader.WaveFormat, NAudio.Lame.LAMEPreset.STANDARD))
    {
        reader.CopyTo(writer);
    }
}
使用WMA文件的文件名(或
AudioFileReader
类可读取的任何其他音频文件)和要保存并让其运行的文件名调用:

static void Main(string[] args)
{
    ConvertToMP3(@"C:\temp\test.wma", @"C:\temp\test_transcode.mp3");
}
当您的输入文件采用MP3编码器不支持的格式时,可能会出现问题。奇怪的频道计数、采样格式或采样率都可能导致MP3编写器失败。我的测试文件在解码时是44.1KHz单IEEE浮点格式,Lame编解码器非常乐意使用它。如果您发现其中一个不起作用,那么您必须进行一些示例转换,以将输入数据转换为兼容的格式


此外,您可能还想在
LameMP3FileWriter
构造函数中使用quality参数。有多种预设(如LAME编码器本身所定义的),或者如果愿意,可以尝试每秒千位的直接规格
NAudio.Lame.lameposet.STANDARD
生成一个128Kbps的文件。

可能是No的重复,而不是重复。我已经看过了那个页面,但正如我提到的,它使用了我找不到的类。如果您可以告诉我在哪里可以找到代码中的所有类,那么我们可以将其标记为重复(尽管它仍然不会,因为该页面没有提供任何线索)。否则,我的问题仍然是lstands.convert from wma to wav,然后wav tomp3@M.kazemAkhgary谢谢你的建议,但我该怎么做呢?我仍然有相同的基本问题,我没有正确的类来处理同一项目中的wma和mp3文件。即使我使用wav,我仍然需要两组类。首先,我给你一个不直接将wav转换成mp3的原因。这是可能的,而且速度更快,但通常转换器不会直接转换文件。因为有很多音频格式。您需要一系列算法来直接从每种格式转换为另一种格式。因此,很难找到一种直接将wma转换为mp3的算法。(但我不是说什么都没有)。它不可能与Naudio转换,因为它不支持wma到wav,也不支持wav到mp3。抱歉,因为我正在睡觉,所以迟了评论。可能是重复的,不是重复的。我已经看过了那个页面,但正如我提到的,它使用了我找不到的类。如果您可以告诉我在哪里可以找到代码中的所有类,那么我们可以将其标记为重复(尽管它仍然不会,因为该页面没有提供任何线索)。否则,我的问题仍然是lstands.convert from wma to wav,然后wav tomp3@M.kazemAkhgary谢谢你的建议,但我该怎么做呢?我仍然有相同的基本问题,我没有正确的类来处理同一项目中的wma和mp3文件。即使我使用wav,我仍然需要两组类。首先,我给你一个不直接将wav转换成mp3的原因。这是可能的,而且速度更快,但通常转换器不会直接转换文件。因为有很多音频格式。你需要面包