c++ - OggVorbis ov_open() 抛出访问冲突异常

标签 c++ windows fseek oggvorbis

我正在尝试使用 Vorbis SDK/DLL 打开 OggVorbis 文件。 ov_open() 引发访问冲突异常 0x00000014。我检查了该文件是否存在:我使用 fopen 打开它并将内容打印到控制台以进行检查 - 一切正常!

可能没有什么不同,但 DLL 已被编译为 DEBUG Win32,并且我的项目正在相同的配置下编译。

为了保证安全,我使用了文件的绝对路径,并且文件确实存在。如前所述,我可以自己打开阅读。

*.ogg 文件是使用 FL Studio 以 192kbps 渲染的,它也可以在 Adob​​e Audition 和 VLC Media Player 中打开和播放。

这是我必须打开文件并将其发送到 Vorbis 库的代码(代码来自 this 教程):

FILE* oggFile;
const char* path = "C:\\absolute\\path\\to\\file.ogg";
const char* openMode = "rb";
int result;

if (!(oggFile = fopen(path, openMode)))
{
    throw std::string("Could not open file.");
}

if ((result = ov_open(oggFile, &oggStream, NULL, 0)) < 0)
{
    // Never gets here
    fclose(oggFile);
    throw std::string("Could not open Ogg stream: ");
}

抛出异常的“Vorbis”代码:

// vorbisfile.c: line #827

static int _fseek64_wrap(FILE *f,ogg_int64_t off,int whence) {
    if(f==NULL)return(-1);
    return fseek(f,off,whence); // Exception thrown here
}

此时,off == 0 and whence == 1

我确实看到方法名称包含“64”。这可能是想读取一个 64 位编码的文件吗?或者当它实际编译为 32 位时它是否试图以 64 位运行?或者这根本不是问题? :P

此外,在我按照教程进行操作时,我注意到代码中有几个错误,我必须更正这些错误。所以我想知道本教程是否足够“完整”,即:也许有一些变量我应该 #define,或者在将打开的文件发送到 ov_open 之前可能缺少的其他东西 以便对其进行相应处理。

技术规范:

  • Windows 10
  • Visual Studio Express 2013
  • _MSC_VER 1800
  • libogg.dll v1.3.2(当前)
  • libvorbis.dll v1.3.5(当前)

注意:下载的 Vorbis 源代码仅包含 SolutionProject VS2010 之前的文件。我在 Visual Studio Express 2013 中打开了 VS2010 Solutions 来编译它们,以便与我的项目兼容。我也想知道这是否会导致一些问题。

最佳答案

OggVorbis 文档建议不要在 Windows 上使用 ov_open (https://xiph.org/vorbis/doc/vorbisfile/ov_open.html)。

改用 ov_open_callbacks。

像这样的东西应该可以工作:

ov_open_callbacks(oggFile, &oggStream, NULL, 0, OV_CALLBACKS_DEFAULT);

关于c++ - OggVorbis ov_open() 抛出访问冲突异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39417913/

相关文章:

c++ - 我应该在任何地方都使用 std::and boost::prefixes 吗?

c++ - 使用 pthead_exit() 退出线程时内存泄漏

C 程序 : How to properly use lseek() or fseek() to modify a certain part of a file?

c - 如何访问文件的特定部分并在C编程中使用它?

c++ - 单例模式性能问题

c++ - Node.js 和 C/C++ 集成 : how to properly implement callbacks?

python - 无法在 Windows 7 上导入 ctypes

php - 什么是编写此函数的更好方法。它获取一个远程文件并将其复制到本地,在 php 中

c - 安排 Windows 在 C 上启动

C : files manipulation Can't figure out how to simplify this code with files manipulation