libogg libvorbis:下载ogg文件的正确方法

时间:2018-11-02 10:13:06

标签: c++ android-ndk vorbis oggvorbis

在一个Android项目中,我使用this example使用libogg和libvorbis库从ogg文件中即时提取音频样本(这样我就可以对其进行处理并将它们重定向到音频输出)。它运作良好,我也可以毫无问题地查找文件。

但是,当我想从当前正在下载的文件中执行此操作时,大多数情况下,搜索功能不起作用。

这是我打开ogg文件的方式(为简单起见,我将其简称):

OggVorbis_File vorbisFile;
FILE *audioFile = fopen("/local/path/to/the/file.ogg", "r");
ov_open_callbacks(audioFile, &vorbisFile, NULL, 0, OV_CALLBACKS_NOCLOSE);
if (ov_seekable(&vorbisFile) == 0)
{
    // file not seekable (never happened, even if currently downloading):
    exit(1);
}

这是我在ogg文件中查找的方式:

ov_pcm_seek(&vorbisFile, seekPosition);

这是我发现的结果:经过一些测试,由于ov_pcm_seek(),我决定在调用ov_pcm_total(&vorbisFile, -1)函数时检查文件长度。我发现,此函数返回的大小始终是文件首次打开时的大小。所以发生了什么事情,当我将文件查找到打开文件时不存在的位置时,它就无法工作。

这是我的(丑陋的)解决方案:到目前为止,我得到的唯一解决方案是,在寻求之前,基本上关闭并重新打开音频文件:

ov_clear(&vorbisFile);
fclose(audioFile);
audioFile = fopen(cheminFichier.c_str(), "r");
ov_open_callbacks(audioFile, &vorbisFile, NULL, 0, OV_CALLBACKS_NOCLOSE);

到目前为止,它实际上运行良好,但是看起来并不好...

我的问题是:是否有更好的方法可以打开并搜索当前正在下载的音频文件?

感谢您的帮助。

0 个答案:

没有答案