2013-01-06 53 views
1

我想扮演的是使用下面的方法存儲爲一個字節數組聲音:播放直接從字節數組的聲音 - Java的

byte[] clickSamples = getAudioFileData("sound.wav"); 
ByteBuffer buffer = ByteBuffer.allocate(bufferSize*2); 
int tick = 0; 

for (int i = 0; i < clickSamples.length; i++) { 
    buffer.putShort((short) clickSamples[i]); 
    tick++; 
    if (tick >= bufferSize/SAMPLE_SIZE) { 
     line.write(buffer.array(), 0, buffer.position()); 
     buffer.clear(); 
     tick = 0; 
    } 
} 

這是一種很難解釋什麼錯。我得到一個聲音,但它只是像一個「旋風」 - 一種噪音。

我想使用這個方法的字節緩衝區等,因爲我的整個應用程序是圍繞它建立的。使用剪輯或AudioInputStream不是一個真正的選擇。

所以我想我的問題是:

如何播放聲音直接使用一個字節的緩衝區我的字節數組?

謝謝你的幫助!

+1

任何機會:如果您將您的ByteBuffer命令設置爲little endian會發生什麼? – fge

+0

我也注意到,我聽到的聲音聽起來像是我的聲音文件向後播放,但失真並伴有大量白色噪音。通過將緩衝區順序變爲小端,一切都變得更響。 – Macks

+0

我用來獲取音頻數據的方法是這樣的:http://snippi.com/s/ndi3f4x – Macks

回答

1

我設法使它工作。這是我的新代碼:

int tick = 0; 
    for (int i = 0; i < clickSamples.length; i++) { 
     tick++; 
     if (tick >= bufferSize/SAMPLE_SIZE) { 
      line.write(clickSamples, i-tick+1, tick); 
      buffer.clear(); 
      tick = 0; 
     } 
    } 

這似乎是播放聲音就像使用的AudioInputStream一個複雜的方式,但現在我能做到在每個tick ++並通過這樣做,我可以介入,如果我需要給確切的時間計算。

如果這聽起來很愚蠢,並且有更簡單的方法,請告訴我。

此外,它聽起來如此扭曲的原因是它看起來像ByteBuffer徹底改變了我的樣本值。出於什麼原因我不知道。如果有人知道,請告訴我!

謝謝。 :)

+0

嘿,我是一個全新的聲音。你有任何想法如何解決我的問題在這裏:http://stackoverflow.com/questions/20184650/why-am-i-getting-this-lineunavailableexception? – trusktr