gpt4 book ai didi

c++ - 使用 sf_open_fd() 时 libsndfile 总是出现段错误

转载 作者:行者123 更新时间:2023-11-30 02:02:15 26 4
gpt4 key购买 nike

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

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

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

最佳答案

可能在第一行:

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() 。这可能是问题所在。

关于c++ - 使用 sf_open_fd() 时 libsndfile 总是出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13458872/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com