我正在使用 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 能力,这是一个非常丑陋的解决方案。这不是对任何答案的回应,我只知道我可以做到但不希望这样做。