我正在創建一個純Java音頻混合庫,最好是可以與Android一起使用的一個庫,它並不完全實用,但絕對是一件有趣的事情。我確信它已經完成了,但僅僅爲了我自己的學習體驗,我正在嘗試使用wav文件來做到這一點,因爲通常沒有壓縮模型可以解決。我應該如何管理移動音頻混音軟件中的內存?
鑑於java.io的本質,它定義了許多InputStream類的類。每個實現主要用於從某個基礎資源讀取數據的操作。之後你對數據做了什麼,將其轉儲或聚合到你自己的地址空間等等,取決於你。我希望這是純粹的Java,例如適用於任何事情(無需JNI),針對低內存配置進行了優化,並且易於擴展。
我瞭解RIFF格式的性質以及如何組裝PCM樣本數據,但我對管理將文件充氣到內存中所需內存的最佳方式感到茫然。使用FileInputStream,基於底層文件系統以及讀取操作的調用方式,一次只讀取大量數據。 FileInputStream不提供索引文件中的哪個位置的方法,以便以後檢索要混合的流是不可能的。我的目標是將RIFF文檔充入Java對象,以便讀取和寫入底層塊的適當區域。
如果我爲整個事物分配空間,例如所有PCM採樣數據,這就像每首歌曲平均50 MB。在典型的智能手機或平板電腦上,這會影響整體性能的可能性有多大?我會更好地使用自己的InputStream類型來跟蹤InputStream中的塊嗎?對於文件而言,這會在獲取PCM採樣時導致大量阻塞,但仍然會減少系統上的整個內存佔用量。
感謝Bjorn,RandomAccessFile正是我正在尋找的數據結構!此外,我絕對不會在回放線程中的文件中讀取,因爲它阻止了它。相反,我想創建一個數據結構來訪問塊區域,以便混合或過濾它們的樣本,然後寫入新的wav文件。我只是想避免將整個事物讀入內存,並且沒有看到使用傳統輸入流和字節緩衝區的方法。我一定會檢查你的幻燈片。謝謝一堆。 –
您可以使用FileInputStream,如果您想要返回到文件中較早的位置,它只會強制您重新打開。以我的經驗來看,這個表現並不是一個殺手,但我從來沒有測試過它和YMMV。顯然,RandomAccessFile是更自然的工作方式。 –