将PCM转换为MP3 / 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’容器’是否可以接受编码数据?

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

谢谢。

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

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

遗憾的是,如果您计划将此用于个人用途以外的任何其他问题,则许可问题仍然存在。 LAME本身是根据LGPL许可的,但其实施的专利仍需要Frauenhofer / Thompson根据LAME Wikipedia条目获得许可。 如果你打算为别人制作东西,这会花费很多 。

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

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

1) PCM到OGG

 string fileName = @"e:\Down\male.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(); }