直接从字节数组播放声音 - Java

时间:2013-01-06 22:52:49

标签: java audio io bytearray wav

我正在尝试使用以下方法播放存储为字节数组的声音:

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不是一个真正的选择。

所以我想我的问题是:

如何使用字节缓冲区直接从字节数组播放声音?

感谢您的帮助!

1 个答案:

答案 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彻底改变了我的样本值。出于什么原因我不知道。如果有人知道,请告诉我!

谢谢。 :)