私は 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);
Ogg Vorbis ファイルを保持するために必要な実際のバイト サイズを調べるには、どの方法を使用すればよいですか?
編集;
ファイルの全長にわたって ov_reads を実行し、それらの読み取りの合計を解凍サイズとして取得できることはわかっています。ただし、私は Android で作業していて、そもそも CPU パワーが限られているため、2 重に解凍しないことを好みます。これはかなり醜い解決策です。これは回答に対する回答ではありません。できることはわかっていますが、やりたくないのです。