OggVorbis ov_open()引发访问冲突异常

时间:2016-09-09 18:43:01

标签: c++ windows fseek oggvorbis

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

可能没有区别,但DLL已经编译为 DEBUG Win32 ,我的项目正在相同的配置下进行编译。

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

使用FL Studio以192kbps的速度渲染* .ogg文件,它也可以在Adobe 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 == 0whence == 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 源代码仅包含解决方案项目文件,最高可达VS2010。我在Visual Studio Express 2013中打开了VS2010 Solutions 来编译它们,以便与我的项目兼容。我也想知道这是否会导致一些问题。

1 个答案:

答案 0 :(得分:1)

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

改为使用ov_open_callbacks。

这样的事情应该有效:

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