簡體   English   中英

Vorbis查找文件的解壓縮大小

[英]Vorbis finding decompressed size of file

我正在使用 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 能力,這是一個非常丑陋的解決方案。 這不是對任何答案的回應,我只知道我可以做到但不希望這樣做。

我知道這已經晚了四年,但我從來沒有找到這個問題的真正答案。 我很久以前采用的解決方案是使用固定大小字節數組的鏈表,每個字節數組代表一塊解壓縮數據。 每個 ov_read 會將數據存儲到一個新的塊中,並且塊將一個接一個地鏈接在一起,直到整個文件被解碼。 隨后的回放只會從每個塊中按順序獲取數據並重播。

這在解壓縮大文件時顯然會崩潰,並導致對解壓縮的塊進行大量內存管理(卸載單個文件意味着完全解除所有塊的鏈接,以便它們可以被垃圾收集)。

我剛剛在使用帶有 XAudio2 的 Vorbisfile API 流式傳輸 ogg 時遇到了同樣的問題。

對我有用的修復方法是調用ov_raw_seek (在ov_open_callbacksov_info調用之后,但在ov_pcm_totalov_read之前)來尋找文件的開頭。 顯然,這“修復”了 pcm 位置/偏移變量周圍的內部狀態。

之后,我測試的所有 ogg 文件都可以正常播放。

這給了我線索: https ://github.com/xiph/vorbis/issues/60

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM