C# MP3 压缩器






4.74/5 (43投票s)
2004 年 1 月 20 日
4分钟阅读

732671

17401
使用 LAME 项目中的 "lame_enc.dll" 的 C# MP3 压缩器。
引言
对我上一篇文章 (C Sharp Ripper) 的第一个问题是关于如何直接刻录到 MP3 格式。然后我寻找一些为 .NET 框架编写的 MP3 压缩器,但没有找到确切的解决方案,所以我决定自己写一个。解决方案是使用 LAME MP3 编码器,特别是用 C# 封装 lame_enc.dll 的函数。有关 LAME 项目的技术和版权信息,请参阅此网站。
在这项工作中,代码来自文章:A low level audio player in C# by Ianier Munoz。
背景
虽然 LAME 编码器是用 C 编写的,并且所有源代码都可用,但人们可能会想到将这些源代码文件编译成托管 C++ 来获得一个托管压缩器。然而,实现这一目标的更简单方法是通过 lame_enc.dll 提供的函数来使用 LAME 压缩器。这个 DLL 导出了几个函数,相对容易使用。
使用 DLL 的一个问题是,在当前版本中,无法同时压缩两个流。我在本文中介绍的压缩器 (Mp3Writer
) 是一个派生自 AudioWriter
的类,AudioWriter
是一个二进制写入器,可以用作不同音频流(不同的音频格式化器、压缩器等)的写入器基类。AudioWriter
接收 PCM 格式的音频数据,然后数据被压缩并写入结果流,或者不经修改地使用特定格式(例如 WAV 格式,如 WaveWriter
类)写入。
使用代码
AudioWriter
和其他基类及工具类在名为 yeti.mmedia
的库中。所有与 MP3 压缩器相关的其他类都在 yeti.mp3
库中。在此库中,我包含了使用 lame_enc.dll 所需的所有结构、常量和函数的翻译。以下代码显示了使用 MP3 压缩器的最简单方法,使用默认配置。
...
using WaveLib;
using Yeti.MMedia;
using Yeti.MMedia.Mp3;
..
WaveStream InStr = new WaveStream("SomeFile.wav");
try
{
Mp3Writer writer = new Mp3Writer(new FileStream("SomeFile.mp3",
FileMode.Create), InStr.Format);
try
{
byte[] buff = new byte[writer.OptimalBufferSize];
int read = 0;
while ( (read = InStr.Read(buff, 0, buff.Length)) > 0 )
{
writer.Write(buff, 0, read);
}
}
finally
{
writer.Close();
}
}
finally
{
InStr.Close();
}
首先,创建一个 WaveStream
来从 WAV 文件读取未压缩的音频数据,然后创建一个 Mp3Writer
。调用 Mp3Writer
构造函数,将要写入结果 MP3 流的流(在本例中为 FileStream
)作为第一个参数,将指定输入数据格式的 WaveFormat
作为第二个参数。读取输入流直到结束,所有数据都写入写入器,写入器将其转换为 MP3 格式并将结果保存到输出流。
Mp3Writer
构造函数还有另外两个重载:一个接受 BE_CONFIG
实例,这是一个从 LAME 翻译过来的结构,描述了流必须如何压缩(比特率、压缩方法、质量等)。另一个重载接受 Mp3WriterConfig
实例,它封装了 BE_CONFIG
并且是可序列化的,因此可以使用序列化来持久化压缩器配置。另一个重要的类是 EditMp3Writer
,它是一个自定义控件,可以包含在窗体或对话框中以配置压缩器参数,如示例代码所示。
另一个使用写入器的例子可能是我的文章 C Sharp Ripper 中描述的 ripper 的改进版本,可以直接刻录到 MP3 格式。在 Form1.cs 文件中,在 "Save as.." 按钮的处理程序中,有以下一行
m_Writer = new WaveWriter(WaveFile, Format);
可以更改为
m_Writer = new Mp3Writer(WaveFile, Format);
其余代码保持不变,当然,如果您需要更多对压缩器参数的控制,那么您应该添加额外的代码来使用 BE_CONFIG
和/或 Mp3WriterConfig
。
结论
正如这里所示,使用这个压缩器相对容易。当需要对压缩过程进行更多控制时,那么必须对每个 LAME 结构的字段的含义和用法有更深入的了解。另外需要注意的是,如果您在任何产品中使用此代码,您应该遵守 LAME 产品许可的详细信息。
使用本产品不代表拥有 Thomson 和/或 Fraunhofer Gesellschaft 的相关知识产权的许可,也不暗示有权在任何最终用户或即用型最终产品中使用本产品。需要独立许可才能进行此类使用。有关详细信息,请访问 http://www.mp3licensing.com。
您可以在我的文章 Windows Media Audio Compressor 中找到 Windows Media Audio (WMA) 压缩器的第一个版本。在我的文章 C Sharp Windows Media Format SDK translation 中可以找到一个更好的压缩器和 Windows Media Format SDK 的翻译。