2010-04-05 291 views
2

如何使用java合併兩個wav文件?如何將兩個wav文件合併/合併爲一個wav文件?

我試過this但它沒有正常工作,是他們的其他方式嗎?

+2

它是如何正確工作的?什麼地方出了錯? – 2010-04-05 14:37:07

+0

結果文件出來太短。 您需要考慮我嘗試合併的每個文件的文件需要1秒或更少。也許這是原因。 – 2010-04-05 14:55:35

+0

所以每個文件是1秒或更少?最大歌曲長度是2秒?不是你在做什麼? – 2010-04-05 15:15:07

回答

11

如果你直接使用wav文件的字節,你可以在任何編程語言中使用相同的策略。對於這個例子,我假定兩個源文件具有相同的比特率/數字通道,並且具有相同的長度/大小。 (如果不是,你可以在開始合併之前編輯它們)。

在WAV specificaiton首先來看看,我發現在stanford課程的網站一個很好的一個:

常見的頭部長度是44個或46字節。

如果你想連接兩個文件(即在一個單一的文件播放WAV一個接着另一個):

  1. 找出格式化的WAV文件是
  2. 砍掉第一44/46字節它們是標題,文件的其餘部分是數據
  3. 創建一個新文件並粘貼其中的一個標題。

    新wav文件= {標題} = {} 44/46字節長

  4. 從原始文件

    新wav文件= {頭+數據1 + DATA2} =添加兩個數據部分{ 44/46 + size(data1)+ size(data2)}字節長

  5. 在兩處修改您的標題以反映新文件的長度。

    a。修改字節4 + 4(即從偏移量4開始的4個字節)。 新值應該是一個十六進制數字,代表新的wav文件的大小,以字節爲單位{44/46 + size(data1)+ size(data2)} - 8bytes。

    b。修改字節40 + 4或42 + 4(從偏移量40或42開始的4個字節,具體取決於您是否有44byte頭或46字節頭)。 新值應該是一個十六進制數字,代表新的wav文件的總大小。即{44/46 +尺寸(數據1)+尺寸(數據2)}

如果你想,而不是合併或兩個文件混合(讓他們都在同一時間玩當時):

  1. 如果兩個文件的長度相同,則不必編輯標頭。
  2. 從字節44/46開始,您將不得不將每個樣本編輯爲data1中的值+ data2中的值。 例如,如果您的SampleRate是8位,您將修改1個字節,如果您的採樣率是16位,您將修改2個字節。 文件的其餘部分只是存儲表示當時聲音波形的int值的1/2bytes的樣本。

    a。對於文件中剩餘的每個樣本,抓取1/2字節的十六進制字符串,並從文件data1和data2中獲取int值。

    b。將1/2字節整數相加在一起 將結果轉換回十六進制並在輸出文件中使用該值。

    c。您通常必須將該數除以2以得到適合原始1/2比特樣本塊的平均值。當我在objc中嘗試它時(可能與簽名或未簽名的整數有關),我變得失真,只是跳過了部分部分,因爲如果您將非常大聲的聲音合併在一起,它只會是一個問題。 即當data1 + data2大於1/2字節時,聲音將被剪輯。有關於裁剪問題here的討論,您可能想嘗試其中一種裁剪技術。

+0

嗨Thamster,我想合併兩個wav文件。我做到了,但合併後我們可以在這裏兩首歌曲,也與歌曲噪音也occuring..please幫助我... int a = buffer_1 [i]/2; \t \t \t int b = buffer_2 [i]/2; \t \t \t int c =(a + b); \t \t \t datafinal [i] =(byte)c; – sandeep 2013-04-04 09:57:40

+0

感謝您的解決方案。對於未來可能遇到這種情況的任何人,如果不是2就會給我帶來扭曲。我爲16位PCM文件單獨添加每個字節。 – 2017-11-14 15:46:08

2

合併意味着混合,但它聽起來像你這裏意味着串聯。

要與中間的靜音連接,需要在文件中插入一些靜音幀。無聲幀是每個通道都有一個「0」的無聲幀 - 如果使用帶符號的採樣,這實際上是一個0,對於無符號的,它是maxvalue/2。

每個幀將有一個樣本爲每個通道。因此,要以CD格式生成一秒鐘的靜音,您需要插入44100(hz)* 2(每幀通道)= 88200 16位有符號整數,每個值爲0。我不確定如何訪問Java音頻抽象抽象的原始文件,但這是要插入的數據。

相關問題