我正在尝试使用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 == 0
和whence == 1
。
我确实看到方法名称包含“64”。这可能是想读取64位编码文件吗?或者当它实际编译为32位时它是否试图以64位运行?或者这不是问题吗? :P
另外,当我按照教程进行操作时,我注意到代码中有一些错误,我必须纠正。所以我想知道教程是否足够“完整”,即:在将打开的文件发送到#define
之前,可能会有ov_open
或其他可能缺少的变量。它会得到相应的处理。
技术规格:
_MSC_VER
1800 libogg.dll
v1.3.2(当前)libvorbis.dll
v1.3.5(当前)注意:下载的 Vorbis 源代码仅包含解决方案和项目文件,最高可达VS2010。我在Visual Studio Express 2013中打开了VS2010 Solutions 来编译它们,以便与我的项目兼容。我也想知道这是否会导致一些问题。
答案 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);