Vorbis查找文件解压缩后的大小

4
我正在使用JNI和Android NDK绑定来包装Tremor版本的Vorbis。到目前为止,我已经成功地从文件流式传输声音到扬声器。
然而,我还想能够在字节数组中“缓存”小声音,这样当我经常使用这些声音时就没有冗余的解压缩。
我的问题是我不知道数组需要多大才能容纳vorbis文件中的所有PCM数据。
我尝试了以下方法,但没有一种方法能够100%地工作。
pcmDuration = ov_pcm_total(vorbisFile, -1);
pcmDuration *= 2;              // 16bit channels
pcmDuration *= vorbisInfo->channels;   // number of channels.

上述方法对于一些文件完美适用,并精确满足所需大小,但有些文件不行。它会明显低估(通常是约1-2kb),导致数组越界异常。
下面是一个推荐的解决方案,但同样存在这个问题。它得到的结果与上述方法相同。
for(int i = 0; i < ov_streams(vorbisFile); i++)
    size += ov_pcm_total(vorbisFile, i);

我应该使用什么方法来找到保存Ogg Vorbis文件所需的实际字节大小?

编辑:

我知道我可以通过对整个文件进行ov_reads,然后将这些读取的和作为解压缩后的大小。但是,我不想进行双重解压缩,因为我正在Android上工作,它本来就有限的CPU功率,而且那是一个相当丑陋的解决方案。这不是对任何答案的回应,我只是知道我可以这样做,但宁愿不这样做。

2个回答

0

我知道这已经晚了四年,但我从未找到一个真正的答案来回答这个问题。很久以前我采用的解决方案是使用固定大小的字节数组链表,每个数组代表一个解压缩数据块。每次 ov_read 将数据存储到新的数据块中,直到整个文件被解码为止,数据块将一对一地链接在一起。随后的播放只需按顺序从每个数据块中获取数据并重放即可。

当解压缩大文件时,这显然会崩溃,并且需要大量的内存管理来管理解压缩块(卸载单个文件意味着完全取消链接所有块,以便可以进行垃圾回收)。


0

我刚刚遇到了使用Vorbisfile API和XAudio2流式传输ogg的完全相同的问题。

对我有效的解决方法是在ov_open_callbacksov_info调用之后,但在ov_pcm_totalov_read之前调用ov_raw_seek以将其定位回文件开头。显然,这样可以“修复”围绕pcm位置/偏移变量的内部状态。

此后,我测试的所有ogg文件都能正确播放。

这给了我线索:https://github.com/xiph/vorbis/issues/60


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接