使用 sf_open_fd() 时,libsndfile 总是出现段错误

Posted

技术标签:

【中文标题】使用 sf_open_fd() 时,libsndfile 总是出现段错误【英文标题】:libsndfile always segfaults when using sf_open_fd() 【发布时间】:2012-11-19 17:18:46 【问题描述】:

我正在尝试为我正在构建的应用程序流式传输音频,但我遇到了我正在使用的库的障碍。这个库是 libSndFile。每当我调用 sf_open_fd(int fd, int mode, SF_INFO *info, int close_desc); 时,该库总是有一个 SEGFAULT 我使用这个函数而不是 sf_open(const char *path, int mode, SF_INFO *info) 因为我需要让 libSndFile 解码内存缓冲区中的数据。我无法理解sf_virtual_open() 文档,所以我改用它。我可以使用 fileno() 获得一个有效的文件描述符(它通常返回 14)并且我的 FILE 流是有效的,所以它就是这个函数。我不知道它可能在哪里 SEGFAULTing 或在什么地方。有没有更好的方法让 libSndFile 解码内存缓冲区或者我没有使用正确的东西?

这是问题代码(我添加了一些 cmets 让它更有意义)

memset(&/*SF_INFO*/mInfo, 0, sizeof(SF_INFO));

/* FILE* */mpFileStream = tmpfile();

fwrite(/* void* */aBuffer, /*int*/aSize, 1, mpFileStream);

int iDescriptor = fileno(mpFileStream);

if(iDescriptor == -1)

    return /*enum EError*/EError_Unknown;


/* SNDFILE* */mFile = sf_open_fd(iDescriptor, SFM_READ, mInfo, SF_TRUE);

return mFile != NULL ? /*enum EError*/EError_None : /*enum EError*/EError_Unknown;

我真的不想写入磁盘,但我必须获得一个有效的文件描述符和流。

注意:我正在使用 g++ 4.6.3 在 Xubuntu 12.04 上进行编译。

【问题讨论】:

【参考方案1】:

可能在第一行:

memset(&/*SF_INFO*/mInfo, 0, sizeof(SF_INFO));

您稍后使用 mInfo 作为指针参数调用 sf_open_fd(),所以我猜测 mInfo 实际上是 SF_INFO* 而不是 SF_INFO。 memset() 允许任何指针类型,因此不会出现编译错误。

顺便说一下,您不需要写入磁盘 - tmpfile() 返回一个打开的文件,该文件应该与 fileno() 一起使用。

编辑:实际上,当您说您不知道 SEGFAULT 发生在哪里时,我可能误解了您的问题。我在 libsndfile 文档中发现的一件事是,如果您的程序链接到与库不同的运行时,则无法使用 sf_open_fd()。这可能是问题所在。

【讨论】:

哦,抱歉,忘记指定我的操作系统,我在 Linux (Xubuntu 12.04) 上,我将更改 memset 行,因为在查看代码时,这似乎不是现在。所以我会一直玩下去,直到(希望如此)有效果为止,感谢您指出这一点! 好吧,没有更多的 SEGFAULT!非常感谢! @HerrJoebob 不同运行时的问题实际上只是 Windows 上的问题。我在 Linux 或 OS X 上从未见过或听说过这个问题。

以上是关于使用 sf_open_fd() 时,libsndfile 总是出现段错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 php artisan migrate 时,迁移时更改表名,使用 tinker 保存对象时出错

使用前台服务时允许“使用应用程序时”而不是“始终允许”是不是可以?

为啥在使用自适应查询执行时要使用广播时火花洗牌

使用自定义效果时缺少网格颜色,但使用 BasicEffect 时没有

使用google可视化api时,使用dashboard时如何使用getChartLayoutInterface()

使用PUTTY+xming时出错