我正在尝试为我正在构建的应用程序流式传输音频,但我正在使用的库遇到了障碍。这个库是libSndFile。每当我调用sf_open_fd(int fd, int mode, SF_INFO *info, int close_desc);
我使用此函数而不是sf_open(const char *path, int mode, SF_INFO *info)
时,该库总是有一个 SEGFAULT,因为我需要让 libSndFile 解码内存缓冲区中的数据。我无法理解sf_virtual_open()
文档,所以我改用它。我可以使用 fileno() 获取一个有效的文件描述符(它通常返回 14),并且我的 FILE 流是有效的,所以它就是这个函数。我不知道它可能在哪里出错或是什么。有没有更好的方法让我让libSndFile解码内存缓冲区,或者我没有使用正确的东西?
这是问题代码(我添加了一些注释以使其更有意义)
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 上进行编译。
可能在第一行:
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()。这可能是问题所在。