如何使用libsndfile将.wav文件加载到数组中?

时间:2012-08-04 00:25:24

标签: c++ windows-7 wav libsndfile

我查看过使用libsndfile的示例程序,但是无法编译它们中的任何一个。我希望能够将.wav文件读入整数(或双精度数组)数组,而不必担心它是什么类型的.wav文件,甚至是标题中的任何内容。我只关心将数据放入数组中,因此我可以对各个样本进行自己的处理。

我已经下载了libsndfile的源代码。有这么多文件和文件夹,我不知道从哪里开始。我需要包括什么?我需要使用哪些方法?有人有一个实际有效的简单例子吗?

3 个答案:

答案 0 :(得分:2)

我是libsndfile的主要作者/维护者。

预编译的二进制包包含windows DLL,文档,头文件以及一些VC7和VC9项目文件示例。

您需要源代码的唯一原因是,如果源代码是tarball,请查看examples /目录中的示例程序。

答案 1 :(得分:0)

这里似乎是 libsndfile,预编译和打包,以便在Windows 7上轻松安装:http://www.mega-nerd.com/libsndfile/libsndfile-1.0.25-w64-setup.exe

(当然,没有什么可以阻止你随时调查源代码,如果它感兴趣你这样做;但是,即使你感兴趣的源,你使用预编译包的练习将有助于你定向到看来 libsndfile的本机平台是Debian GNU / Linux,因此在Windows下使用源代码可能有点棘手。幸运的是,如果预编译的软件包适合你,那么你不必担心关于来源的更多信息。)

答案 2 :(得分:0)

有点老了,但我想我会为将来的读者而高兴。

两个答案都不能回答主要问题:如何使用libsndfile将.wav文件加载到数组中?

使用SndFileHandle和C ++ 17的答案(实际上17不必要,但嘿,我喜欢鼓励使用):

#include <sndfile.hh>
std::filesystem::path path = "file/path.wav";
if (std::filesystem::path::is_regular_file(path))
{
  SndfileHandle myf = SndfileHandle(&path.string()[0]);
  std::vector<float> array(myf.frames());
  myf.read(&array[0], int(myf.frames());
}

可以在这里找到更多信息:http://ofdsp.blogspot.com/2011/07/loading-wav-file-with-sndfilehandle.html(此示例受此启发)

还要注意,我选择将其读入浮点向量。可能是任何事情,只要记住您得出的结果可能取决于wav(或其他声音类型)文件的比特率,尽管我相信libsndfile的编写可以使您很大程度上忘记这一点。

对于第一个问题的其他部分,其他答案就足够了。