Vorbis找到解压缩的文件大小

时间:2011-12-28 08:42:52

标签: java c oggvorbis vorbis

我正在使用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文件所需的实际字节大小?

EDIT;

我知道我可以在文件的整个长度上执行ov_reads,并将这些读取的总和作为解压缩的大小。但是我宁愿不进行双重解压缩,因为我在Android上工作,而且它的CPU功率有限,这是一个非常难看的解决方案。这不是对任何答案的回应,我只知道我可以做到,但不愿意。

1 个答案:

答案 0 :(得分:0)

我知道这已经晚了四年,但我从来没有找到这个问题的真正答案。我很久以前使用的解决方案是使用固定大小字节数组的链表,每个数组代表一个解压缩数据块。每个ov_read都会将数据存储到一个新的块中,并且块将逐个链接在一起直到整个文件被解码。后续回放只是顺序从每个块中获取数据并重放它。

在解压缩大文件时显然会崩溃,导致解压缩块的大量内存管理(卸载单个文件意味着完全解除所有块的链接,以便可以对它们进行垃圾回收)。