在 C++ 中连接 .wav 文件

Posted

技术标签:

【中文标题】在 C++ 中连接 .wav 文件【英文标题】:Concatenate .wav files in C++ 【发布时间】:2016-03-07 01:23:18 【问题描述】:

我怎样才能使用函数、库以及任何我需要的东西来连接两个 .wav 文件?输入应该是绝对路径,而输出应该是在某处创建并放置(不仅仅是播放)的音频文件,在哪里并不重要。

我正在用 XCode 6 编写一个 Mac 命令行应用程序。

【问题讨论】:

通过fopen()打开文件,通过getc()fread()读取文件,然后计算新的头值和数据,然后通过putc()fwrite()输出。另外不要忘记通过fclose()关闭文件。 我不知道这些是什么,我会阅读它们并尝试一下。 【参考方案1】:

.wav 文件格式是一种非常简单的格式,由定义音频文件属性的固定标头组成;即字节序、通道数和采样率。它的文档在 intertubes 上得到了广泛的定义。

我不记得是否有任何通用库提供了一种方便的方法来做到这一点(值得通过libsndfile's API documentation 寻找适合该法案的东西)。

在任何情况下,读取两个 WAV 文件的标题、检查它们的格式,然后创建输出文件应该不会太难。如果两个 WAV 文件具有相同的字节序、通道数和采样率,则该过程很简单,否则您必须至少重新采样/重新混合其中一个文件。

【讨论】:

我可以用什么来做到这一点?会是 MikeCAT 所说的吗? 是的,除了这是 C++,所以它是 std::ifstream 和 std::ofstream。【参考方案2】:

有一个非常简单、轻量级和成熟的开源C API 库for reading-writing several common audio file formats。我已经有一段时间没有使用它了,如果我没记错的话,它具有打开声音文件进行写入、寻找结尾、从另一个文件附加数据和更新标题的例程。我希望这会有所帮助。

【讨论】:

以上是关于在 C++ 中连接 .wav 文件的主要内容,如果未能解决你的问题,请参考以下文章

wav 文件中的数据在 -1 和 1 之间,c++,sndfile

写入 WAV 文件 C++

在 C++ 中使用 libsndfile 从 WAV 文件中提取原始音频数据

如何在 Linux 上用 C++ 播放 .wav 文件?

同时使用 DirectShow 播放多个 wav 文件并记录它们 C++

在 C# 或 C++ 中将压缩的 wav 文件转换为未压缩的 wav 文件的最简单方法是啥?