我正在尝试使用以下方法播放存储为字节数组的声音:
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不是一个真正的选择。
所以我想我的问题是:
如何使用字节缓冲区直接从字节数组播放声音?
感谢您的帮助!
答案 0 :(得分: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彻底改变了我的样本值。出于什么原因我不知道。如果有人知道,请告诉我!
谢谢。 :)