1

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

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

所以我想我的问题是:

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

感谢您的帮助!

4

1 回答 1

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 一样,但现在我可以对每个滴答++进行计算,并且如果需要,我可以干预准确的时间。

如果这听起来很傻,并且有更简单的方法可以做到这一点,请告诉我。

此外,它听起来如此失真的原因是 ByteBuffer 似乎彻底改变了我的样本值。什么原因我不知道。如果有人知道,请告诉我!

谢谢你。:)

于 2013-01-07T01:51:31.980 回答