1

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

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

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

*.ogg 文件是使用 FL Studio 以 192kbps 的速度渲染的,它在 Adob​​e 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

此外,当我按照教程进行操作时,我注意到代码中存在一些我必须更正的错误。所以我想知道本教程是否足够“完整”,即:也许有一些变量 I should ,或者在将打开的文件发送到以便对其进行相应处理#define之前可能缺少的其他东西。ov_open

技术规格:

  • 视窗 10
  • 视觉工作室速成版 2013
  • _MSC_VER1800
  • libogg.dllv1.3.2(当前)
  • libvorbis.dllv1.3.5(当前)

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

4

1 回答 1

1

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);
于 2016-09-09T18:55:33.887 回答