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

OggVorbis ov_open() Throws Access Violation Exception

本文关键字:访问冲突 异常 ov open OggVorbis      更新时间:2023-10-16

我正在尝试使用Vorbis SDK/dll打开OggVorbis文件。ov_open()抛出访问冲突异常0x00000014。我已经检查了文件的存在:我已经用fopen打开了它,并将内容打印到控制台只是为了检查-一切都很好!

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

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

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

抛出异常的"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 (current)
  • libvorbis.dll v1.3.5 (current)

注意:下载的Vorbis源代码仅包含SolutionProject文件,直到VS2010。我在Visual Studio Express 2013中打开VS2010 解决方案来编译它们,以获得与我的项目的兼容性。我也想知道这是否会导致一些问题。

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