【问题标题】:Convert PCM to MP3/OGG将 PCM 转换为 MP3/OGG
【发布时间】:2013-12-10 17:09:09
【问题描述】:

我需要将连续的 PCM 流或编码音频(ADPCM、uLaw、Opus)转换为 MP3/OGG​​ 格式,以便将其流式传输到浏览器(使用 html 的音频标签)。我有“stream-mp​​3/ogg-using-audio-tag”部分工作,现在我需要开发转换层。

我有两个问题:

  1. 如何使用 NAudio 和/或其他 C# 库/框架将 PCM 转换为 MP3/OGG​​?我假设 NAudio 演示应用程序中有一个或两个代码 sn-p 可能会执行此操作,但我一直无法找到它。
  2. 在将编码数据(ADPCM、uLaw、OPUS)转换为 MP3/OGG​​ 之前,是否必须将其转换为 PCM(我可以),或者 MP3/OGG​​ 的“容器”是否可以接受编码数据?李>

注意:我了解 MP3 存在许可问题,因此我们愿意使用 OGG。

谢谢。

【问题讨论】:

  • 认为我需要的信息是link的底部@

标签: c# mp3 naudio pcm ogg


【解决方案1】:


我为NAudio 编写了一个插件,它使用LAME Encoder 套件中的libmp3lame 来处理MP3 编码。它在 NuGet 上为 NAudio.Lame,来源在 GitHub
Plug>

遗憾的是,如果您打算将其用于个人用途以外的任何用途,许可问题仍然存在。 LAME 本身在LGPL 下获得许可,但它实施的专利仍需要根据LAME Wikipedia entry 获得 Frauenhofer/Thompson 的许可。如果您打算为他人制作一些东西,请联系expensive

Vorbis 压缩机不受专利等的影响,因此它是一个合理的替代方案。在某个时候,我计划做一个与 OGG/Vorbis 格式类似的包装器。同时,快速Google Search 会出现Ogg Vorbis Interop Library,这可能对您有用。

是的,在几乎任何转换中,您都需要 PCM 作为中间格式。 NAudio 为您提供了从各种音频格式中获取 PCM 的工具。

【讨论】:

  • 感谢您的建议。根据Wikipedia,经过进一步审查,我似乎无法使用 OGG,因为 IE 不支持它。
  • Corey,我能够让您的 NAudio.Lame 与命令行 .exe 工具一起工作,但是一旦我将代码移到 ASP.NET Web API 项目中,我就会得到加载 libmp3lame.64.dll 时出现异常,即使该文件位于我网站的 bin 文件夹中。有任何想法吗?有没有更好的地方可以发布 NAudio.Lame 问题?
  • 抱歉耽搁了托尼...请查看this answer 了解此类问题。
  • 谢谢,我在您的 Wiki 中看到了该条目,但我总是忘记 Web API 基本上是用于 Web 服务的 MVC,因此许多 MVC“问题/修复”也适用于它。等我回去工作我会试一试的。
【解决方案2】:

要回答您的第一个问题,要创建 MP3 或 OGG,您需要一个编码器。 NAudio 不包含 MP3 或 OGG 编码器。它所做的只是为您提供访问计算机上已安装的编码器的方法(例如 ACM 或 Media Foundation Transforms)。但是,对于 MP3 和 OGG,您会发现最简单的方法是找到非托管 DLL 或命令行实用程序并从 .NET 访问它们。您在上面链接到的我写的文章简要说明了如何使用 LAME.exe 与 stdin 和 stdout 即时将 PCM 转换为 MP3。

关于你的第二个问题,答案是肯定的。每当您转码时,您首先解码为 PCM,然后在目标编解码器中重新编码。我认为理论上你可以将任何格式的音频编码到 OGG 容器中,但实际上,OGG 容器中的音频通常是用 Vorbis 编码的。 FLAC 和 OPUS 可能是选项,但您需要再次找到可以为您编写 OGG 容器格式的应用程序或库,因为我不知道有任何完全托管的 OGG 编写器。

【讨论】:

  • 感谢您的回复。我现在正在查看 NAudioWpfDemo 代码。我认为“媒体基础编码”可能有我需要的东西。
  • 我查看了演示代码,但由于某种原因,当我选择“MP3”时,“编码器设置”列表框没有填充任何内容,有什么想法吗?我还注意到在 NAudio 1.7(我正在使用)中有一个 EncodeToMp3,但是如果我正确读取了代码项目页面,它必须写入一个真实的文件,而不是一个流,对吗?
  • 因为它只显示对输入文件的采样率有效的 MP3 编码。是的,这个写入文件 - 它只是包装媒体基础编码器的辅助方法。
  • 所以,在我可以使用 MF 编码器之前,我需要将我的 8K、16 位、单声道输入“转换”为 MP3 编码器可以接受的东西,对吧?在哪里可以找到 MP3 编码器可接受格式的列表?
  • 由于我们当前的开发环境(Win7 和 Server 2008 R2)没有原生 MP3 编码器,我使用 lame.exe 并重定向 stdin/stdout 来处理我们的转换。如果/当这个项目有任何希望离开原型阶段时,我会考虑使用 Win8/Server2012(它有 mp3 编码器,我希望支持 Stream-to-Stream)和/或深入了解 Corey 的 NAudio。蹩脚(乍一看,它似乎支持 Stream-to-Stream)。
【解决方案3】:

1) PCM to OGG

string fileName = @"e:\Down\male.wav";
Sox.Convert(@"sox.exe", fileName, fileName + ".ogg");

2) PCM to MP3

    static void AnyToMp3(string fileName)
    {
        DsReader dr = new DsReader(fileName);
        IntPtr formatPcm = dr.ReadFormat();
        byte[] dataPcm = dr.ReadData();
        dr.Close();
        IntPtr formatMp3 = AudioCompressionManager.GetCompatibleFormat(formatPcm,
            AudioCompressionManager.MpegLayer3FormatTag);
        byte[] dataMp3 = AudioCompressionManager.Convert(formatPcm, formatMp3, dataPcm, false);
        Mp3Writer mw = new Mp3Writer(File.Create(fileName + ".mp3"));
        mw.WriteData(dataMp3);
        mw.Close();
    }

【讨论】:

  • 我们将这个项目搁置了几个月,直到昨天,您在同一天发布的事实一定是命运。我将通过您的网站向您发送一些关于您的图书馆的问题。
猜你喜欢
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
相关资源
最近更新 更多