我正在使用JNI和Android NDK绑定来包装Tremor版本的Vorbis。到目前为止,我已经成功地从文件流式传输声音到扬声器。
然而,我还想能够在字节数组中“缓存”小声音,这样当我经常使用这些声音时就没有冗余的解压缩。
我的问题是我不知道数组需要多大才能容纳vorbis文件中的所有PCM数据。
我尝试了以下方法,但没有一种方法能够100%地工作。
上述方法对于一些文件完美适用,并精确满足所需大小,但有些文件不行。它会明显低估(通常是约1-2kb),导致数组越界异常。
下面是一个推荐的解决方案,但同样存在这个问题。它得到的结果与上述方法相同。
然而,我还想能够在字节数组中“缓存”小声音,这样当我经常使用这些声音时就没有冗余的解压缩。
我的问题是我不知道数组需要多大才能容纳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功率,而且那是一个相当丑陋的解决方案。这不是对任何答案的回应,我只是知道我可以这样做,但宁愿不这样做。