OggVorbis ov_open()抛出访问冲突exception

我试图用Vorbis SDK / DLL打开一个OggVorbis文件。 ov_open()抛出一个访问冲突exception0x00000014 。 我检查了存在的文件:我用fopen打开它,并将内容打印到控制台上,以便检查 – 一切正常!

可能没有什么区别,但是DLL已经被编译为DEBUG Win32 ,并且我的项目在相同的configuration下编译。

我正在使用文件的绝对path来确保文件的存在。 如前所述,我可以自己打开并阅读。

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

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

 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: "); } 

抛出exception的“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 == 0whence == 1

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

另外,当我跟着教程时,我注意到代码中有一些错误,我必须纠正。 所以我想知道这个教程是否足够“完整”,也就是说,可能有一些variables我应该定义,或者是在将打开的文件发送到ov_open之前可能会丢失的东西,以便相应地处理。

技术规格:

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

注意:下载的Vorbis源代码只包含解决scheme项目文件,直到VS2010。 我在Visual Studio Express 2013中打开VS2010 解决scheme进行编译,以达到与我的项目的兼容性。 我也想知道这是否会导致一些问题。

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);