小编典典

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

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;
    }
}

很难解释出了什么问题。我听到声音了,但只不过是一种“旋风”式的声音。

我想将此方法与字节缓冲区一起使用,以此类推,因为我的整个应用程序都是围绕它构建的。使用Clip或AudioInputStream并不是真正的选择。

所以我想我的问题是:

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

谢谢您的帮助!


阅读 349

收藏
2020-11-23

共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大大改变了我的采样值。由于什么原因,我不知道。如果有人知道,请告诉我!

谢谢。:)

2020-11-23