gpt4 book ai didi

java - Vorbis查找文件的解压缩大小

转载 作者:行者123 更新时间:2023-12-03 20:25:24 24 4
gpt4 key购买 nike

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

最佳答案

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

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

关于java - Vorbis查找文件的解压缩大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8653670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com