【发布时间】:2009-01-22 15:40:27
【问题描述】:
如何以编程方式将 WAV 文件压缩为另一种格式(PCM、11,025 KHz 采样率等)?
【问题讨论】:
-
这是在特定的操作系统上吗?
标签: c++ audio compression format wav
如何以编程方式将 WAV 文件压缩为另一种格式(PCM、11,025 KHz 采样率等)?
【问题讨论】:
标签: c++ audio compression format wav
【讨论】:
在 Linux 中使用 sox(Sound eXchange:通用声音样本翻译器): SoX 是一个命令行程序,可以将最流行的音频文件转换为大多数其他流行的音频文件格式。它可以选择 在翻译过程中更改音频样本数据类型并为文件应用一种或多种音效。
【讨论】:
如果您的意思是如何将 PCM 数据压缩为不同的音频格式,那么您可以使用多种库来执行此操作,具体取决于您要支持的平台。如果你只是想改变 PCM 数据的采样率,那么你需要一个采样率转换算法,这是一个完全不同的问题。您能更具体地说明您的要求吗?
【讨论】:
您问的是重采样,更具体地说是下采样,而不是压缩。虽然这两个过程都是有损的(意味着您将遭受信息丢失),但下采样适用于原始样本而不是频域。
如果您对压缩感兴趣,那么您应该研究 lame 或 OGG vorbis 库;您无疑熟悉 MP3 和 OGG 技术,尽管我从您的问题中感觉您有兴趣获取较低采样率的 PCM 文件。
在这种情况下,您需要一个重采样库,其中有几个可能性。最广为人知的是libsamplerate,老实说,我不推荐它,因为不仅在生成的音频文件中存在质量问题,而且在库本身中使用的代码的稳定性也是如此。正如其他一些人提到的那样,另一种非商业可能性是sox。根据程序的性质,您可以将 sox 作为单独的进程执行,也可以通过将其用作库从自己的代码中调用它。我个人没有尝试过这种方法,但我现在正在开发一个使用 sox 的产品(实际上是用于上采样),我们对结果非常满意。
另一种选择是编写自己的采样率转换库,这可能是一项艰巨的任务,但是,如果您只对使用整数因子(即从 44.1kHz 到22kHz,或者从 44.1kHz 到 11kHz),那么实际上很容易,因为你只需要去除每 N 个样本。
【讨论】:
在 Windows 中,您可以使用音频压缩管理器在文件之间进行转换(acm... 函数)。您还需要 WAVEFORMAT 结构和 WAV 文件格式的工作知识。不幸的是,自己编写所有这些内容需要一些时间,这就是为什么研究其他人建议的一些开源选项可能是个好主意。
我编写了一个我自己的开源 .NET 音频库,名为 NAudio,它可以利用您机器上安装的 ACM 编解码器将 WAV 文件从一种格式转换为另一种格式。我知道你已经用 C++ 标记了这个问题,但是如果 .NET 是可以接受的,那么这可能会为你节省一些时间。查看 NAudioDemo 项目以获取转换文件的示例。
【讨论】: