2012-05-26 25 views
0

我正在創建一個純Java音頻混合庫,最好是可以與Android一起使用的一個庫,它並不完全實用,但絕對是一件有趣的事情。我確信它已經完成了,但僅僅爲了我自己的學習體驗,我正在嘗試使用wav文件來做到這一點,因爲通常沒有壓縮模型可以解決。我應該如何管理移動音頻混音軟件中的內存?

鑑於java.io的本質,它定義了許多InputStream類的類。每個實現主要用於從某個基礎資源讀取數據的操作。之後你對數據做了什麼,將其轉儲或聚合到你自己的地址空間等等,取決於你。我希望這是純粹的Java,例如適用於任何事情(無需JNI),針對低內存配置進行了優化,並且易於擴展。

我瞭解RIFF格式的性質以及如何組裝PCM樣本數據,但我對管理將文件充氣到內存中所需內存的最佳方式感到茫然。使用FileInputStream,基於底層文件系統以及讀取操作的調用方式,一次只讀取大量數據。 FileInputStream不提供索引文件中的哪個位置的方法,以便以後檢索要混合的流是不可能的。我的目標是將RIFF文檔充入Java對象,以便讀取和寫入底層塊的適當區域。

如果我爲整個事物分配空間,例如所有PCM採樣數據,這就像每首歌曲平均50 MB。在典型的智能手機或平板電腦上,這會影響整體性能的可能性有多大?我會更好地使用自己的InputStream類型來跟蹤InputStream中的塊嗎?對於文件而言,這會在獲取PCM採樣時導致大量阻塞,但仍然會減少系統上的整個內存佔用量。

回答

1

我不確定我是否理解你的所有問題,但我會盡我所能。隨意在評論中澄清,我會編輯。

請勿將所有文件數據保存在內存中用於DAW類型的應用程序或任何期望播放大文件的文件/視頻播放器。這可能在某些設備上有效,具體取決於內存型號,但是您需要麻煩。

而是根據需要(即按需)讀取文件的必需部分。它實際上比這更復雜一些,因爲您不想在音頻回放線程中讀取文件(您不希望低延遲的音頻回放依賴於高延遲的文件IO )。爲了解決這個問題,你可能需要提前緩衝一些文件。 (這取決於你使用的是回調模式還是阻塞模式)

使用FileInputStream工作正常,你只需要跟蹤文件中的所有內容(這包括將毫秒或任何要轉換爲字節並考慮頭部的大小[1])。 RandomAccessFile是一個稍微好一點的選項,因爲它可以讓你周圍跳躍。

我從編程的音頻軟件的演講幻燈片可能有幫助,特別是如果你是回調v阻塞困惑:http://blog.bjornroche.com/2011/11/slides-from-fundamentals-of-audio.html

[1],或者更正確,知道文件中的音頻數據的偏移量。

+0

感謝Bjorn,RandomAccessFile正是我正在尋找的數據結構!此外,我絕對不會在回放線程中的文件中讀取,因爲它阻止了它。相反,我想創建一個數據結構來訪問塊區域,以便混合或過濾它們的樣本,然後寫入新的wav文件。我只是想避免將整個事物讀入內存,並且沒有看到使用傳統輸入流和字節緩衝區的方法。我一定會檢查你的幻燈片。謝謝一堆。 –

+0

您可以使用FileInputStream,如果您想要返回到文件中較早的位置,它只會強制您重新打開。以我的經驗來看,這個表現並不是一個殺手,但我從來沒有測試過它和YMMV。顯然,RandomAccessFile是更自然的工作方式。 –