将PCM转换为MP3/OGG



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

我有两个问题:

  1. 如何使用NAudio和/或其他C#库/框架将PCM转换为MP3/OGG?我想NAudio演示应用程序中可能有一两个代码片段在做这件事,但我一直找不到
  2. 在将编码数据(ADPCM、uLaw、OPUS)转换为MP3/OGG之前,我是否必须将其转换为PCM(我可以),或者MP3/OGG"容器"是否可以接受编码数据

注意:我知道MP3有许可证问题,所以我们对使用OGG持开放态度。

谢谢。

<无耻插头>
我为NAudio编写了一个插件,它使用LAME编码器套件中的libmp3lame来处理MP3编码。它在NuGet上作为NAudio.Lame,源代码在GitHub上
<无耻插头>

遗憾的是,如果您计划将其用于除个人用途以外的任何用途,则许可证问题仍然存在。LAME本身根据LGPL获得许可,但根据LAME维基百科条目,其实施的专利仍需要Frauenhofer/Thompson的许可。如果你打算为别人生产一些东西,这可能会变得很昂贵。

Vorbis压缩机不受专利等限制,因此它是一个合理的替代品。在某个时刻,我计划做一个类似于OGG/Vorbis格式的包装器。与此同时,快速的谷歌搜索会发现Ogg Vorbis Interop Library,这可能对你有用。

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

要回答您的第一个问题,要创建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编写器。

1)PCM到OGG

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

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

最新更新