如何以编程方式将 WAV 文件压缩为另一种格式(PCM、11,025 KHz 采样率等)?
5 回答
Use sox (Sound eXchange : universal sound sample translator) in Linux: SoX is a command line program that can convert most popular audio files to most other popular audio file formats. It can optionally change the audio sample data type and apply one or more sound effects to the file during this translation.
在 Windows 中,您可以使用音频压缩管理器在文件之间进行转换(acm... 函数)。您还需要 WAVEFORMAT 结构和 WAV 文件格式的工作知识。不幸的是,自己编写所有这些需要一些时间,这就是为什么研究其他人建议的一些开源选项可能是个好主意。
我编写了一个我自己的开源 .NET 音频库,名为NAudio,它可以利用安装在您机器上的 ACM 编解码器将 WAV 文件从一种格式转换为另一种格式。我知道你已经用 C++ 标记了这个问题,但是如果 .NET 是可以接受的,那么这可能会为你节省一些时间。查看 NAudioDemo 项目以获取转换文件的示例。
If you mean how do you compress the PCM data to a different audio format then there are a variety of libraries you can use to do this, depending on the platform(s) that you want to support. If you just want to change the sample rate of the PCM data then you need a sample rate conversion algorithm instead, which is a completely different problem. Can you be more specific in your requirements?
你问的是resampling,更具体地说是downsampling,而不是压缩。虽然这两个过程都是有损的(意味着您将遭受信息丢失),但下采样适用于原始样本而不是频域。
如果您对压缩感兴趣,那么您应该查看 lame 或 OGG vorbis 库;您无疑熟悉 MP3 和 OGG 技术,尽管我从您的问题中感觉到您有兴趣以较低的采样率取回 PCM 文件。
在这种情况下,您需要一个重采样库,其中有一些可能性。最广为人知的是libsamplerate,老实说,我不推荐它,因为不仅在生成的音频文件中存在质量问题,而且在库本身中使用的代码的稳定性也是如此。正如其他一些人提到的那样,另一种非商业可能性是sox 。根据程序的性质,您可以将 sox 作为单独的进程执行,也可以通过将其用作库从自己的代码中调用它。我个人没有尝试过这种方法,但我现在正在开发一个使用 sox 的产品(实际上是用于上采样),我们对结果非常满意。
另一种选择是编写自己的采样率转换库,这可能是一项重大任务,但是,如果您只对使用整数因子进行转换(即从 44.1kHz 到 22kHz,或从 44.1kHz 到 11kHz)感兴趣,那么它实际上非常容易,因为您只需要去除每第 N 个样本。