OggVorbis ov_open() 抛出访问冲突异常
OggVorbis ov_open() Throws Access Violation Exception
我正在尝试使用 Vorbis SDK/DLLs 打开一个 OggVorbis 文件。 ov_open()
引发访问冲突异常 0x00000014
。我已经检查过文件是否存在:我用 fopen
打开它并将内容打印到控制台只是为了检查 - 一切正常!
可能没什么区别,但 DLL 已编译为 DEBUG Win32,我的项目正在相同配置下编译。
为了保证安全,我使用了文件的绝对路径,并且文件确实存在。如前所述,我可以自己打开阅读。
*.ogg 文件是使用 FL Studio 以 192kbps 渲染的,它也可以在 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
此外,在我按照教程进行操作时,我注意到代码中有几个错误我必须更正。所以我想知道教程是否 "complete" 足够,即:也许有一些变量我应该 #define
,或者在将打开的文件发送到 ov_open
之前可能缺少的其他东西命令对其进行相应处理。
技术规格:
- Windows 10
- Visual Studio 快递 2013
_MSC_VER
1800
libogg.dll
v1.3.2(当前)
libvorbis.dll
v1.3.5(当前)
注意: 下载的 Vorbis 源代码仅包含 Solution 和 Project 文件到 VS2010。我在 Visual Studio Express 2013 中打开了 VS2010 Solutions 来编译它们,以便与我的项目兼容。我也想知道这是否会导致一些问题。
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);
我正在尝试使用 Vorbis SDK/DLLs 打开一个 OggVorbis 文件。 ov_open()
引发访问冲突异常 0x00000014
。我已经检查过文件是否存在:我用 fopen
打开它并将内容打印到控制台只是为了检查 - 一切正常!
可能没什么区别,但 DLL 已编译为 DEBUG Win32,我的项目正在相同配置下编译。
为了保证安全,我使用了文件的绝对路径,并且文件确实存在。如前所述,我可以自己打开阅读。
*.ogg 文件是使用 FL Studio 以 192kbps 渲染的,它也可以在 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
此外,在我按照教程进行操作时,我注意到代码中有几个错误我必须更正。所以我想知道教程是否 "complete" 足够,即:也许有一些变量我应该 #define
,或者在将打开的文件发送到 ov_open
之前可能缺少的其他东西命令对其进行相应处理。
技术规格:
- Windows 10
- Visual Studio 快递 2013
_MSC_VER
1800libogg.dll
v1.3.2(当前)libvorbis.dll
v1.3.5(当前)
注意: 下载的 Vorbis 源代码仅包含 Solution 和 Project 文件到 VS2010。我在 Visual Studio Express 2013 中打开了 VS2010 Solutions 来编译它们,以便与我的项目兼容。我也想知道这是否会导致一些问题。
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);