1

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

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

一个问题是周围似乎有两个版本的 NAudio,而且似乎都不完整。你从 Nuget 得到的不包括 WMAFileReader 类,所以没有办法(我可以看到)读取 wma 文件。github 上的版本包括 WMAFileReader 类,但似乎不包括 Mp3Writer 类,也不包括我在许多示例中看​​到的 WaveLib 类。

那么,有人知道我怎样才能得到可以完成这项工作的东西吗?我浪费了数小时尝试不同的代码示例,但它们似乎都不适用于我能找到的任何一个版本的 NAudio。

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

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

4

1 回答 1

5

看起来很简单...

创建一个新的控制台项目,用于nuget添加NAudio.Lame包(我创建它是为了封装LAMEMP3 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 Mono IEEE-float 格式,Lame 编解码器非常乐意使用它。如果您发现其中一个不起作用,那么您将不得不进行一些示例转换,以将您的输入数据转换为兼容的格式。

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

于 2015-07-06T06:51:44.890 回答