2010-08-30 42 views
2

我想讀一個WAV文件(和將來也MP3Ogg)的C.爪哇 - 讀WAV文件作爲一個int數組

文件作爲Java的float數組,就像libsndfile我正在查看javax.sampled包中的各種文檔,但我無法找到關於如何執行此操作的明確說明;如果可能,我想避免重複使用外部庫。

有什麼建議嗎?

+0

爲什麼float數組?波形文件是音頻數據的字節流。 – 2010-08-30 10:06:40

+0

我必須從中提取與音樂相關的功能,所以我需要浮動或雙打 – 2010-08-30 10:09:16

+0

您的意思是提取RIFF塊? – 2010-08-30 11:04:30

回答

0

找到了這個網頁:

http://www.jsresources.org/faq_audio.html

特別是9.4參見:如何從一個字節數組重建樣本值?

它通過比較java的輸出與C++(libsndfile)和matlab(wavread)來按預期工作。 我打算把代碼放在m的github上,當我有空的時候

2

JavaSound將只允許您「原始」訪問嵌入WAV文件中的聲音數據,例如, 8位無符號PCM或16位帶符號PCM數據(如果你的WAV文件是PCM編碼的話)。無論哪種情況,每個樣本的值都在0到255或-32768到32767的範圍內,您只需將範圍移到適合-1f到1f的範圍即可。

您應該從AudioSystem.getAudioInputStream(...)開始使用合適的源文件(InputStream或URL),檢查格式以檢查樣本大小和通道數,然後您可以相應地讀取和轉換來自AudioInputStream的PCM編碼數據。

+0

謝謝,那是一個很好的起點。但是,我如何擴展它們呢?我使用ByteBuffer類來讀取整數值,但縮放無法按預期工作:負值縮放不正確,可能是因爲整數算術的東西... 例如,對第一個值進行規範化,八度給我 1.00000 1.06250 -0.12500 2.31250 0.75000 0.37500 -0.37500 0.50000 0.00000 0.87500 while java gives me 1.0 1.0625 -0.062744140625 2.3125 0.75 0.375 -0.312744140625 0.5 0.0 0.875 – 2010-08-30 13:13:14