将PCM转换为MP3 / OGG

时间:2013-12-10 17:09:10

标签: c# mp3 naudio pcm ogg

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

我有两个问题:

  1. 如何使用NAudio和/或其他一些C#库/框架将PCM转换为MP3 / OGG?我假设NAudio演示应用程序中有一个或两个代码片段可能正在执行此操作,但我无法找到它。
  2. 在将其转换为MP3 / OGG之前,我是否必须将编码数据(ADPCM,uLaw,OPUS)转换为PCM(我可以),或者MP3 / OGG'容器'是否可以接受编码数据?
  3. 注意:我理解MP3存在许可问题,因此我们愿意使用OGG。

    感谢。

3 个答案:

答案 0 :(得分:2)

<无耻插头>
我为NAudio编写了一个插件,它使用LAME Encoder套件中的libmp3lame来处理MP3编码。它位于NuGet上NAudio.Lame,来源位于GitHub < / Shameless Plug>

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

Vorbis压缩机不受专利等因素的影响,因此它是一种合理的选择。在某些时候,我计划对OGG / Vorbis格式进行类似的包装。在此期间,快速Google Search会显示可能对您有用的Ogg Vorbis Interop Library

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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();
    }