2015-06-03 52 views
2

有隨機訪問的AudioInputStream的例子嗎?像任何普通的音頻播放器那樣 - 無論你想,當你把酒吧和它不管你想要玩,我怎麼能訪問字節音頻流中以這種方式?隨機存取

一些簡單的類似:read(byte[] buffer, long startingFrom)其中startingFrom可無論我想要的音頻流

+0

似乎不太可能;流的整個想法是,你只能從頭到尾閱讀(或寫)它們。看起來你可以用Java Sound API做的最好的是將整個文件讀入內存(例如一個字節數組),然後從內存中播放它。 – immibis

回答

1

使用在AudioInputStream(?模擬)隨機訪問中是一樣的在正常InputStream。您可以在文件的開頭創建mark(),所以read()任何電話已經完成了。然後,當你想要做的隨機訪問,停止從流中讀取,去標記位置調用reset()然後用skip()去你想要的位置。

注意,最初的「標記」將默認爲0的AudioInputStream,所以不需要初始呼叫。然而,這種行爲沒有被指定,所以將來可能會改變。

如果基礎流(例如您給構造函數的InputStream)支持它,則AudioInputStream(Oracle Java 8)的實現支持此機制。你可以通過調用markSupported()來找到AudioInputStream是否支持它。

不幸的是,當使用AudioSystem的效用函數創建AudioInputStream時,您無法影響基礎流。它甚至可以在每個平臺上不同。如果你的數據流不支持它(或者你想絕對確定它支持它),你可以創建一個新的AudioInputStream,通過包裝一個BufferedInputStream。例如像這樣:

AudioInputStream normalStream = AudioSystem.getAudioInputStream(...); 
AudioInputStream bufferedStream = new AudioInputStream(new BufferedInputStream(normalStream), 
            normalStream.getFormat(), AudioSystem.NOT_SPECIFIED); 

免責聲明:我認爲這有一個'黑客'來創建隨機訪問。 令我驚訝的是,我很少發現使用 InputStream中的標記/重置機制來模擬隨機訪問。這可能是因爲它有一個警告。 編輯:John Skeet與我一致在這種方法。