【问题标题】:How can I use libsndfile to load a .wav file into an array?如何使用 libsndfile 将 .wav 文件加载到数组中?
【发布时间】:2012-08-02 01:02:47
【问题描述】:

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

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

【问题讨论】:

  • 你在哪个平台上?你的操作系统是什么?
  • 我使用的是 Windows 7(64 位)

标签: c++ windows-7 wav libsndfile


【解决方案1】:

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

(当然,如果您感兴趣的话,没有什么可以阻止您随时研究源代码;但是,即使您确实对源代码感兴趣,您使用预编译包的练习也将有助于您了解源代码。看来 libsndfile 的本机平台是 Debian GNU/Linux,因此在 Windows 下使用该源代码可能有点棘手。不过幸运的是,如果预编译的软件包适合您,那么您不必担心更多关于来源的信息。)

【讨论】:

  • 当然,答案假定您还没有安装预编译包。你的问题似乎没有说,一种或另一种方式。祝你好运。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    有点老了,但我想我会为未来的读者插话。

    这两个答案都没有回答主要问题:如何使用 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 是为了让你在很大程度上忘记这一点。

    至于最初问题的其他部分,其他答案就足够了。

    【讨论】:

      猜你喜欢
      • 2011-08-05
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多