有隨機訪問的AudioInputStream的例子嗎?像任何普通的音頻播放器那樣 - 無論你想,當你把酒吧和它不管你想要玩,我怎麼能訪問字節音頻流中以這種方式?隨機存取
一些簡單的類似:read(byte[] buffer, long startingFrom)
其中startingFrom可無論我想要的音頻流
有隨機訪問的AudioInputStream的例子嗎?像任何普通的音頻播放器那樣 - 無論你想,當你把酒吧和它不管你想要玩,我怎麼能訪問字節音頻流中以這種方式?隨機存取
一些簡單的類似:read(byte[] buffer, long startingFrom)
其中startingFrom可無論我想要的音頻流
使用在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);
免責聲明:我認爲這有一個'黑客'來創建隨機訪問。
令我驚訝的是,我很少發現使用
編輯:John Skeet與我一致在這種方法。InputStream
中的標記/重置機制來模擬隨機訪問。這可能是因爲它有一個警告。
似乎不太可能;流的整個想法是,你只能從頭到尾閱讀(或寫)它們。看起來你可以用Java Sound API做的最好的是將整個文件讀入內存(例如一個字節數組),然後從內存中播放它。 – immibis