2011-05-12 60 views
4

我有一個問題之前:Reading wav file in Java如何使用Java將wav文件劃分爲1秒?

首先,我要讀與Java wav文件,並得到其字節加工成一個陣列。其次,我將刪除它的沉默(這是另一個問題的話題)。

那之後,我會除以wav文件到1個第二零件(我應該處理頭問題的小wav文件,這是一個主要問題)

我試圖與讀取wav文件與Java API,我的上一個問題的答案。但是,使用該API,我應該爲頭部或API做任何事情,並且自己做什麼,以及如何將該wav文件與Java分成1秒。另一個API或其他任何東西都可以。

+0

* .wav *文件格式非常簡單。我在* .wav *文件上完成了FFT並自己編寫了* .wav *閱讀器,這是相當小的代碼。你首先需要計算出編碼(單聲道還是立體聲?8位或16位?每秒樣本數:44.1 kHz或22 kHz?等),然後從中計算出需要獲取的樣本數量第二。 – SyntaxT3rr0r 2011-05-12 13:50:59

+0

@ SyntaxT3rr0r:如果文件是* canonical *,WAV格式實際上只是簡單的,意思是後跟樣本的44字節標頭。 WAV文件實際上是一個RIFF文件,並且頭部信息不必全部包含在前44個字節中(儘管它*在大多數WAV文件中是*)。 – MusiGenesis 2011-05-12 14:05:53

+0

@ SyntaxT3rr0r我在這裏問了一個相關的問題:http://stackoverflow.com/questions/5983457/problem-with-reading-wav-file-with-java – kamaci 2011-05-12 19:50:56

回答

2

您參考的API將返回包含原始WAV文件中的示例數據的double[]數組。所有你需要做的就是創建一堆較小的數組(每一秒長),並從原始數組中的適當位置複製到每個較小的數組中(以便將所有原始數據複製到較小的數組中)。然後,只需使用API​​的寫入方法從每個較小的陣列創建實際的WAV文件即可。

使用該API意味着您不必擔心自己的頭(這是一件好事,因爲它們易於編寫,但可能會非常複雜)。

每個較小陣列的大小取決於原始的格式。如果原始WAV文件是44.1 KHz採樣率的單聲道,那麼1秒的數組將包含44,100個元素。

+0

* .wav *格式使用離散值來存儲聲音,比如說,16位/ 44.1千赫茲/立體聲。 API如何將這些離散值轉換爲* double [] *數組?在某些地方,事情變得非常糟糕:) OP應該能夠做他的部門做*「非破壞性編輯」*,但我以某種方式懷疑使用* double [] *存儲離散值的API可以被信任;) – SyntaxT3rr0r 2011-05-12 13:47:39

+0

@ SyntaxT3rr0r:像這樣的API處理浮點和整數(即32位)採樣數組實際上是非常正常的,因爲它可以讓您混合多個16位源而不必擔心溢出(這將是一個巨大的問題如果你將它們混合成一個16位緩衝區)。然而,使用64位類型(例如'double'和'long')是完全沒有意義的,而且API也不能以任何方式支持「short」(16位整數),儘管事實如此那就是生成的WAV文件的格式。 – MusiGenesis 2011-05-12 14:10:30

+0

我在這裏問了一個相關的問題:http://stackoverflow.com/questions/5983457/problem-with-reading-wav-file-with-java – kamaci 2011-05-12 19:50:40

相關問題