我需要将连续的PCM流或编码音频(ADPCM,uLaw,Opus)转换为MP3 / OGG格式,以便可以将其流式传输到浏览器(使用html的音频标签)。我有“stream-mp3 / ogg-using-audio-tag”部分工作,现在我需要开发转换层。
我有两个问题:
注意:我理解MP3存在许可问题,因此我们愿意使用OGG。
感谢。
答案 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)
string fileName = @"e:\Down\male.wav";
Sox.Convert(@"sox.exe", fileName, fileName + ".ogg");
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();
}