【问题标题】:How to convert from wma to mp3 using NAudio如何使用 NAudio 从 wma 转换为 mp3
【发布时间】:2015-09-22 19:05:50
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 不,不是重复的。我已经看过那个页面,但正如我所提到的,它使用了我找不到的类。如果你能告诉我在哪里可以找到代码中的所有类,那么也许我们可以将其标记为重复项(尽管它仍然不会,因为该页面没有提供任何线索)。否则,我的问题仍然存在。
  • 从 wma 转换为 wav,然后从 wav 转换为 mp3
  • @M.kazemAkhgary 谢谢你的建议,但我该怎么做呢?我仍然有同样的基本问题,我没有正确的类来处理同一个项目中的 wma 和 mp3 文件。即使我通过 wav,我仍然需要两组课程。
  • 首先我给你一个为什么不直接将wav转换为mp3的理由。它可能,甚至更快,但通常转换器不要直接转换文件。因为有很多音频格式。您需要一堆算法来直接从每种格式转换为另一种格式。所以很难找到一种算法直接从 wma 转换为 mp3。 (但我不是说什么都没有)。它无法使用 Naudio 进行转换,因为它不支持 wma 到 wav 也不支持 wav 到 mp3。但是我阅读这篇文章会对您有所帮助。抱歉,因为我在睡觉,所以迟到了评论。

标签: c# mp3 naudio wma


【解决方案1】:

看起来很简单...

创建一个新的控制台项目,使用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 Mono IEEE-float 格式,Lame 编解码器很乐意使用它。如果您发现其中一个不起作用,那么您将不得不进行一些示例转换,以将您的输入数据转换为兼容的格式。

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

【讨论】:

  • 感谢您的回复,看起来很简单。问题是,无法识别 MameMP3Writer。我开始了一个新的 VS2013 解决方案,添加了 NAudio.Lame Nuget 包(也添加了 NAudio)并复制了您的 ConvertToMP3 方法,但 LameMP3Writer 以红色突出显示,并标有“无法解析符号”。有任何想法吗?查看packages.config,看起来我有NAudio 1.7 版和NAudio.Lame 1.0.2 版。另外,NAudio.Wma 包添加了什么?再次感谢。
  • 您是否使用了完整的类型名称(包括命名空间)?你有NAudioNAudio.Lame 的当前版本,和我之前在测试中使用的一样。尝试将 using NAudio.Lame; 添加到您的使用部分,看看是否有帮助。
  • 我完全复制了您的代码(复制和粘贴),其中包括完整的命名空间。 Resharper 自动添加了 NAudio.Lame 和 NAudio.Wave 的使用。有任何想法吗?如果您愿意,我可以将我的示例项目发送给您,以便您查看哪里出了问题。或者,如果您愿意,可以给我发一份 (mryossu@hotmail.com)。如果我们做同样的事情似乎很奇怪。再次感谢
  • @AvrohomYisroel 对不起,我是个白痴。我打字而不是复制,然后没有回来查看。该类实际上命名为LameMP3FileWriter
  • 是的,我刚刚发现并准备发表评论!再次非常感谢。如果 NAudio 包处理 wma 文件,那么 NAudio.Wma 包是干什么用的?
猜你喜欢
  • 2013-10-25
  • 2013-01-22
  • 2013-12-08
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多