如何使用 NAudio 从 wma 转换为 mp3
How to convert from wma to mp3 using NAudio
请注意这不是链接的其他问题的重复。它使用了我找不到的 classes,详见我下面的问题。
我正在尝试将 wma 文件转换为 mp3。我需要一个可以集成到我的代码库中的解决方案,而不是依赖外部资源,所以使用 ffmpeg 不是一个选项。我一直在尝试 NAudio,但没有成功。
一个问题是似乎有两个版本的 NAudio,而且似乎都不完整。您从 Nuget 获得的文件不包括 WMAFileReader class,因此无法(我可以看到)读取 wma 文件。 version on github 包括 WMAFileReader class,但似乎不包括 Mp3Writer class,也不包括我在许多示例中看到的 WaveLib class。
那么,有人知道我怎样才能得到可以胜任这项工作的东西吗?我已经浪费了几个小时尝试不同的代码示例,但是 none 它们似乎适用于我能找到的任一版本的 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
class 可读的任何其他音频文件)和您要保存到的文件名调用它 运行 :
static void Main(string[] args)
{
ConvertToMP3(@"C:\temp\test.wma", @"C:\temp\test_transcode.mp3");
}
当您的输入文件采用 MP3 编码器不支持的格式时,这可能 运行 会出现问题。奇怪的通道数、采样格式或采样率都可能导致 MP3 刻录机失败。我的测试文件在解码时是 44.1KHz Mono IEEE-float 格式,Lame 编解码器很乐意使用它。如果您发现它不起作用,那么您将不得不进行一些示例转换,以将您的输入数据转换为兼容格式。
您可能还想尝试一下 LameMP3FileWriter
构造函数中的质量参数。有多种预设(在 LAME 编码器本身中定义),或者如果您愿意,您可以尝试直接指定千比特每秒。 NAudio.Lame.LAMEPreset.STANDARD
生成一个 128Kbps 的文件。
请注意这不是链接的其他问题的重复。它使用了我找不到的 classes,详见我下面的问题。
我正在尝试将 wma 文件转换为 mp3。我需要一个可以集成到我的代码库中的解决方案,而不是依赖外部资源,所以使用 ffmpeg 不是一个选项。我一直在尝试 NAudio,但没有成功。
一个问题是似乎有两个版本的 NAudio,而且似乎都不完整。您从 Nuget 获得的文件不包括 WMAFileReader class,因此无法(我可以看到)读取 wma 文件。 version on github 包括 WMAFileReader class,但似乎不包括 Mp3Writer class,也不包括我在许多示例中看到的 WaveLib class。
那么,有人知道我怎样才能得到可以胜任这项工作的东西吗?我已经浪费了几个小时尝试不同的代码示例,但是 none 它们似乎适用于我能找到的任一版本的 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
class 可读的任何其他音频文件)和您要保存到的文件名调用它 运行 :
static void Main(string[] args)
{
ConvertToMP3(@"C:\temp\test.wma", @"C:\temp\test_transcode.mp3");
}
当您的输入文件采用 MP3 编码器不支持的格式时,这可能 运行 会出现问题。奇怪的通道数、采样格式或采样率都可能导致 MP3 刻录机失败。我的测试文件在解码时是 44.1KHz Mono IEEE-float 格式,Lame 编解码器很乐意使用它。如果您发现它不起作用,那么您将不得不进行一些示例转换,以将您的输入数据转换为兼容格式。
您可能还想尝试一下 LameMP3FileWriter
构造函数中的质量参数。有多种预设(在 LAME 编码器本身中定义),或者如果您愿意,您可以尝试直接指定千比特每秒。 NAudio.Lame.LAMEPreset.STANDARD
生成一个 128Kbps 的文件。