我正在尝试使用以下方法播放存储为字节数组的声音:
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; } }
很难解释出了什么问题。我听到声音了,但只不过是一种“旋风”式的声音。
我想将此方法与字节缓冲区一起使用,以此类推,因为我的整个应用程序都是围绕它构建的。使用Clip或AudioInputStream并不是真正的选择。
所以我想我的问题是:
如何使用字节缓冲区直接从字节数组播放声音?
谢谢您的帮助!
我设法使它起作用。这是我的新代码:
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大大改变了我的采样值。由于什么原因,我不知道。如果有人知道,请告诉我!
谢谢。:)