Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Vorbis查找文件的解压缩大小_Java_C_Oggvorbis_Vorbis - Fatal编程技术网

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

Java Vorbis查找文件的解压缩大小,java,c,oggvorbis,vorbis,Java,C,Oggvorbis,Vorbis,我正在使用JNI和Android NDK绑定来包装Vorbis的Tremor版本。到目前为止,我已经成功地将声音从文件传输到扬声器 然而,我也希望能够在字节数组中“缓存”小声音,所以当我经常使用这些声音时,没有多余的解压缩 我的问题是,我不知道数组需要多大才能保存vorbis文件中的所有PCM数据 我试过以下这些方法,但没有一种能100%奏效 pcmDuration = ov_pcm_total(vorbisFile, -1); pcmDuration *= 2; //

我正在使用JNI和Android NDK绑定来包装Vorbis的Tremor版本。到目前为止,我已经成功地将声音从文件传输到扬声器

然而,我也希望能够在字节数组中“缓存”小声音,所以当我经常使用这些声音时,没有多余的解压缩

我的问题是,我不知道数组需要多大才能保存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);
for(int i=0;i
我应该使用什么方法来找出保存Ogg Vorbis文件所需的实际字节大小

编辑


我知道我可以在整个文件长度上进行ov_读取,并将这些读取的总和作为解压缩大小。但是我不想双重解压,因为我在安卓系统中工作,它的CPU能力首先是有限的,这是一个非常丑陋的解决方案。这不是对任何答案的回答,我只是知道我可以做,但我不想做。

我知道这已经晚了四年,但我从未找到这个问题的真正答案。我很久以前使用的解决方案是使用固定大小字节数组的链表,每个数组表示一块解压缩数据。每一次ov_读取都会将数据存储到一个新的块中,块会将一个块链接到下一个块,直到整个文件被解码。随后的回放只需按顺序从每个块中抓取数据并回放

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