2016-02-25 46 views
1

我有幾個原始PCM音頻文件。我可以成功地從這些文件中讀取一串字節,並通過接受PCM數據作爲輸入的音頻播放機制播放它們。PCM字節陣列添加

當我從這些文件中讀取數據時,我將它存儲在byte []中。這些軌道具有相同的尺寸,並且在聲音方面互補(它們聽起來很好)。因此,我想將包含PCM數據的幾個字節[]添加到相同大小的單個字節[]中,表示最終的音樂。

我試圖在一個簡單輕率的方式,通過簡單地做這樣的:

for(int i=0; i<finalbytes.length; i++) 
{ 
    finalbytes[i] = (byte) (music1bytes[i] + music2bytes[i]); 
} 

它實際上不是那麼糟糕。最後的聲音確實是兩個軌道的添加。問題是,當添加一些曲目時,有時在歌曲的特定部分,可以聽到靜態噪音的峯值。這可能是由於添加導致了非鉗位值或某些東西,我不知道如何解決。

那麼,如何添加兩個或多個字節數組的PCM數據?

回答

1

我假設這些原始音頻文件的樣本是8位有符號的。

發生了什麼溢出。如果兩個樣本的總和大於127或小於-128,則不會得到正確的結果 - 您會得到整數溢出。

你可以除以2,每次產生的樣本:

finalbytes[i] = (byte) ((music1bytes[i] + music2bytes[i])/2); 

這樣,即使每個音頻文件的最大樣本值,你不會得到溢出。缺點是生成的文件可能有點安靜。

另一種選擇是剪輯:

int sample = music1bytes[i] + music2bytes[i]; 
sample = Math.min(sample, Byte.MAX_VALUE); 
sample = Math.max(sample, Byte.MIN_VALUE); 
finalbytes[i] = (byte)sample; 

如果兩個音頻源都相當響亮的則可能是一個很大的剪裁,它可能不健全很大。

你也可以嘗試使用JavaSound中的SoftMixingMixer,讓它爲你做混音。因爲您需要定義RAW音頻文件的音頻格式,但實際上可能會有更多的工作,但它可能會給出最佳的音頻結果。使用此選項,您需要將openStream(AudioFormat)與輸出文件的音頻格式一起使用,並告訴調音臺通過線路播放2個RAW音頻文件。