- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试将 Nyquist(一种音乐编程平台,参见:https://www.cs.cmu.edu/~music/nyquist/ 或 https://www.audacityteam.org/about/nyquist/)作为独立程序使用,它使用 libsndfile(用于读写声音的库,参见:http://www.mega-nerd.com/libsndfile/)。我正在 i686 GNU/Linux 机器 (Gentoo) 上执行此操作。
成功设置并无误启动程序后,我尝试通过示例之一“(play (osc 60))”生成声音,但遇到了此错误:
*** Fatal error : sizeof (off_t) != sizeof (sf_count_t)
*** This means that libsndfile was not configured correctly.
进一步调查(并向作者发送电子邮件)证明有些帮助,但解决方案离我的掌握还很远。作者建议查看/usr/include/sndfile.h 以查看 sf_count_t 是如何定义的,并且(这部分)我的文件与他的相同:
/* The following typedef is system specific and is defined when libsndfile is
** compiled. sf_count_t will be a 64 bit value when the underlying OS allows
** 64 bit file offsets.
** On windows, we need to allow the same header file to be compiler by both GCC
** and the Microsoft compiler.
*/
#if (defined (_MSCVER) || defined (_MSC_VER))
typedef __int64 sf_count_t ;
#define SF_COUNT_MAX 0x7fffffffffffffffi64
#else
typedef int64_t sf_count_t ;
#define SF_COUNT_MAX 0x7FFFFFFFFFFFFFFFLL
#endif
作者在上面指出没有“32 位偏移量”选项。我不确定我将如何进行。这是 Nyquist 的作者推荐我调查的特定文件:https://github.com/erikd/libsndfile/blob/master/src/sndfile.h.in ,这里是整个源代码树:https://github.com/erikd/libsndfile
以下是作者电子邮件回复中的一些相关片段:
"I'm guessing sf_count_t must be showing up as 32-bit and you want libsndfile to use 64-bit file offsets. I use nyquist/nylsf which is a local copy of libsndfile sources -- it's more work keeping them up to date (and so they probably aren't) but it's a lot easier to build and test when you have a consistent library."
"I use CMake and nyquist/CMakeLists.txt to build nyquist."
"It may be that one 32-bit machines, the default sf_count_t is 32 bits, but I don't think Nyquist supports this option."
这里是 Nyquist 的源代码:http://svn.code.sf.net/p/nyquist/code/trunk/nyquist/
这个问题对我来说很难解决,因为它由相对晦涩的软件的小众用例组成。这也使得该问题的支持前景有点令人担忧。我知道一点 C++,但我对自己解决这个问题的能力远没有信心。感谢阅读,祝大家节日快乐。如果您有任何建议,即使是在格式或编辑方面,请不要犹豫!
最佳答案
如果您查看 nyquist
中捆绑的 libsndfile
的源代码,即 nylsf
,那么您会看到 sndfile.h
直接提供。它将 sf_count_t
定义为 64 位整数。
libsndfile
源没有这个文件,而是有一个 sndfile.h.in
。这是 autoconf
的输入文件,它是一个可以从该模板生成正确头文件的工具。它目前对 linux 系统的 sf_count_t
有以下定义(并且有一段时间了):
typedef @TYPEOF_SF_COUNT_T@ sf_count_t ;
@TYPEOF_SF_COUNT_T@
将被替换为 autoconf
以生成一个 header ,其工作类型为 sf_count_t
为... build nyquist
提供的头文件因此已经配置好了(大概是针对作者的系统)。
off_t
是POSIX标准规定的类型,定义在系统的libc中。如果系统是 32 位,则它在使用 GNU C 库的系统上的大小是 32 位。
这会导致相关完整性检查失败,因为 sf_count_t
和 off_t
的大小不匹配。错误消息也是正确的,因为我们正在为构建使用配置不当的 sndfile.h
。
在我看来,您有以下选择:
要求 nyquist
作者提供未配置的 sndfile.h.in
并使用 autoconf
在构建时配置此文件时间。
不要使用捆绑的 libsndfile
并链接到系统文件。 (这需要一些知识和工作来更改构建脚本和头文件,可能还有其他意外问题)
如果您使用的是 GNU C 库 (glibc):预处理器宏 _FILE_OFFSET_BITS
可以设置为 64
以强制 off_t 的大小
和文件接口(interface)的其余部分即使在 32 位系统上也可以使用 64 位版本。
这可能有效,也可能无效,具体取决于您的系统是否支持它,并且它不是一个干净的解决方案,因为 libsndfile
的其他配置错误可能会被忽视。此标志还可能引入代码所依赖的其他接口(interface)更改,从而导致进一步的构建或运行时错误/漏洞。
尽管如此,我认为 cmake 的语法是添加:
add_compile_definitions(_FILE_OFFSET_BITS=64)
或取决于 cmake 版本:
add_definitions(-D_FILE_OFFSET_BITS=64)
在适当的 CMakeLists.txt
中。
实际上是 README in nyquist/nylsf
解释了它的文件是如何生成的。您可以尝试获取它所基于的相同 libsndfile
版本的源代码,并重复给出的步骤以生成为您的系统配置的 nylsf
。与 2. 和 3. 相比,它可能会导致更少的问题,因为不会引入任何版本/界面更改。
关于c - sndfile.h中的sf_count_t类型在libsndfile中是怎么定义的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53938092/
我正在尝试将 Nyquist(一种音乐编程平台,参见:https://www.cs.cmu.edu/~music/nyquist/ 或 https://www.audacityteam.org/abo
我想使用“fvad”库来检测音频静音部分,但我有 QByteArray 而不是 SNDFILE。我怎样才能做到这一点? sf_read_double(infile, buf0, framelen) [
我正在尝试从 .wav 中读取数据并将其放入 fft。要读取 wav 文件,我正在使用 sndfile 库。 SNDFILE* infile; SF_INFO sfinfo ; mems
“#include ”是什么意思? (对不起,我是 c\c++ nub) 顺便说一句,我了解 ActionScript 和 HTML。 最佳答案 这是一个预处理器指令,用于包含名为“sndfile.h
我编写了一个小程序来播放 PCM 音频文件,使用来自 github 的引用,并对我的应用程序稍作修改。该程序编译良好,但我在依赖项和 ALSA 设备方面遇到了一些运行时问题。 我收到的错误是: ERR
这个问题已经有答案了: What mean file with extension "h.in"? (3 个回答) 已关闭 8 年前。 我在 Linux 上使用 gcc 进行编译因为 sndfile.
我想使用 textPad 读取 8 位 wav 文件的数据,我知道数据位于第 44/46 字节,但我无法读取它。 我有那个代码: 52 49 46 46 F8 37 01 00 57 41 56 45
我有一个关于语音识别的项目。虽然我使用了库“sndfile.h”,但我仍然停留在读取输入声音上。我有一个疑问:sf_readf_float()函数读取的数据是时域信号,对吧?如果不是,那是什么?有什么
我正在 Windows 7(64 位)上开发 CodeBlocks 12.11。我正在用 C 编程,我正在使用库:libsndfile (http://www.mega-nerd.com/libsnd
我已经编写了一个函数来使用 portaudio 和 sndfile 播放声音文件。不幸的是,音质很糟糕。声音更像是嘶嘶声。以下是我正在使用的函数的源代码。 #define _GLIBCXX_USE_C
我有一个用 SF_FORMAT_WAV|SF_FORMAT_FLOAT 打开的文件,但有 24 位格式的样本。Sndfile 文档说调用程序使用的数据类型和文件的数据格式不需要相同所以使用 sf_wr
我正在托管一个 python Flask 服务,它使用声音文件库进行音频计算。它在我的本地运行良好,但当我在 Redhat 上托管它时,我看到以下问题。任何建议 - from soundfile i
我正在尝试将 TensorFlow Lite 用于使用 Jupyter 笔记本的语音识别项目,但是当我尝试执行“导入 librosa”(使用此处找到的命令:https://github.com/Sha
我正在尝试部署一个使用 TensorFlow 和 Librosa 的 flask 应用程序。因此,作为 Librosa 的依赖项,我需要 sndfile 包。 当我运行我的 Flask 应用程序时,出
我正在尝试为一个小型 python web 项目编写 Dockerfile,但依赖项有问题。我一直在互联网上进行一些搜索,它说 Librosa 库需要 libsndfile 才能正常工作,所以我尝试使
我一直在编写一些代码来使用 PortAudio 和 sndfile 在 C++ 中播放立体声 .wav 文件,但是输出声音是模糊的并且向下倾斜(向下倾斜对我来说不是问题,但它可能是问题的一部分) .看
首先,我是 Go 和低级编程领域的新手,所以请多多包涵...:) 所以我要做的是这个;使用 libsndfile 读取 .wav 文件binding去和玩portaudio . 我找不到这方面的任何例
我在 Windows 10 Pro 机器上使用 Docker(Linux 容器)。我创建了一个 docker 容器来运行我的 flask 应用程序,并在 requirements.txt 文件中提到了
我目前使用的是 Fedora 20 x86_64。我使用以下命令构建了 libsndfile: sudo ./configure BASE_FLAGS=-32 sudo make sudo make
目标是在 Heroku 上部署音频预测 ML 模型,该模型使用 Python 中的 librosa 库。 app.py 文件使用 librosa 库从音频中提取特征。 当我尝试在 Heroku 上部署
我是一名优秀的程序员,十分优秀!